深拷貝實際上是在記憶體中開闢一塊新的位址來存放複製的物件
淺拷貝實際上是 只拷貝一層 更深層物件級別只拷貝位址
僅僅是指向被拷貝的記憶體位址,如果原位址中的物件改變了,那麼淺拷貝出來的物件也會做相應的改變。
深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體
下面詳細講一下
淺拷貝(有圖有真相)
上面說到:淺拷貝 是只拷貝一層,並且如果原位址中的物件改變了,那麼淺拷貝出來的物件也會做相應的改變。是因為他們實際上指向的一塊位址,從圖中可以看到,o 的改變會引發obj 的改變,同理obj 的改變也會引發o 的改變。很清晰吧!
舉個例子再來理解一下哈 上段**
下面來講深拷貝
還是先上圖哈 這樣方便理解
可以看見深拷貝是指向不同的位址,即開闢新的記憶體空間, 或者你如果不理解的話,就是複製了乙個新的記憶體空間,再將複製的位址指向o ,所以說深拷貝在你修改值的時候不會影響另乙個拷貝的物件。
深拷貝的中心思想其實是 將深層次的物件 也拷貝一遍 也就是說
對於下面這樣的物件
var obj=
}name age 是第一層次的物件,是簡單資料型別,而msg 是更深層次的物件,是乙個物件型別的資料
也就是說,如果是普通物件,我們可以第一次遍歷去拷貝,如果是物件型別的資料,我們就再次利用遍歷(for in ) 再去進行賦值操作,然後拷貝。
那上面的這個思路,類似於函式的遍歷,那這個時候其實思路就是類似於遞迴的思路,先遍歷外面的資料,在遍歷裡面的資料,他們遍歷的方式是一樣的,那就可以按照函式遞迴的方式完成。
遞迴:函式func(type a,……)直接或間接呼叫函式本身
還是再來一段** 這樣比較好理解
望指教!
關於深拷貝與淺拷貝
相關理解 注意 閉包中的變數存在在堆記憶體中而非棧記憶體中。賦值與淺拷貝 array.prototype.slice實現對陣列的淺拷貝 array.prototype.concat將陣列和陣列或和值連線在一起成新的陣列 擴充套件運算子 實現淺拷貝 原理 新的物件複製已有物件中非物件屬性的值和物件屬性...
深拷貝與淺拷貝的理解
我們直接通過現象看問題!下面的拷貝建構函式和賦值運算子過載是有問題的!include class string string const string s str s.str 問題 1.記憶體洩漏 2.與拷貝建構函式類似 我們可以從監視視窗清楚的看到,s1和s2共用一塊記憶體空間。s3和s4共用一塊...
關於深拷貝和淺拷貝的理解
淺拷貝 只拷貝指標,相當於引用計數 1 不可變陣列 深拷貝 連同屬性拷貝出乙個新的物件。自定義物件如果想要拷貝需要遵循nscopy協議。沒實現的話使用copy會直接崩潰 1.不可變陣列用copy修飾的原因 nsstring使用copy修飾同理 方式傳入的是乙個可變陣列。如果使用strong修飾,萬一...