當需要乙個物件想把另乙個物件的內容複製乙份給自己時,就出現了拷貝的問題,進而引出深拷貝和淺拷貝。jquery中有拷貝物件的方法
$.extend([deep],targetobj,obj[,obj1][,obj2]):targetobj拷貝obj方法中有三個引數
deep:如果值為true,為深拷貝,否則淺拷貝。預設是淺拷貝
targetobj:拷貝的物件
obj:被拷貝的物件
這個方法支援多個物件的拷貝,所以後面是多個物件,我沒有嘗試多個物件的拷貝,這裡就不涉及了。
介紹完基本的概念,接下來就來操作看看吧。
先建立兩個物件
var obj =
};var targetobj =
};
淺拷貝 —— 第乙個引數為false或者預設
// 淺拷貝
// targetobj 拷貝的是obj在棧記憶體的位址 指向同乙個堆空間的物件
$.extend(targetobj, obj);
obj.wife.height = 170; // 都變化了
淺拷貝的實質就是把被拷貝物件的內容複製乙份給自己。當複製簡單資料型別時,就直接把屬性和屬性值直接複製乙份,如果遇到相同的屬性,拷貝物件的屬性值會覆蓋掉自己原本的屬性值(「hh」變成了「kk」);遇到複雜資料類(這裡的wife屬性),一般是指物件和陣列,是直接複製wife在棧空間的位址,這樣就意味著obj中的wife和targetobj中的wife指向的是同乙個物件,對同乙個物件的引用。在我們更改targetobj或者obj中的wife物件的屬性時,二者都會產生變化。這就是淺拷貝。
看個圖,會更形象。
深拷貝 —— 第乙個引數為true
// 深拷貝
// targetobj 拷貝的是obj在棧記憶體的位址 targetobj在堆空間中重新開闢乙個空間指向自己物件的引用
$.extend(true, targetobj, obj);
targetobj.wife.height = 170; // 互不影響
深拷貝的核心:只是把被拷貝物件的內容複製乙份,目標物件自己在棧空間開闢一塊空間,遇到複雜資料型別時自己在堆空間中開闢一塊空間,引用自己的物件。當更改值時,各改各的值,互不影響,二者只是看起來長的很像但是是兩個不同的物件。targetobj拷貝obj的wife物件時,首先會在棧空間存放自己的位址,再去堆空間開闢一塊空間,位址指向堆空間的物件。這樣實現了不同的物件引用不同的物件,達到兩個物件的分離,互不影響。複製的過程中,會出現覆蓋值得情況,但是沒有關係在複製完畢之後可以自己手動更改屬性值的。
深拷貝最後得到的是兩個全完不同的物件,只是看起來一樣,實際上是兩個不同的物件。
實現的內部圖
兩個內部實現的圖,很清晰的體現了拷貝的核心點。
深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...