如何區分深拷貝和淺拷貝呢?
簡單來說
如果b複製了a,a改變了,b也跟著一起改變了,那麼就是淺拷貝,
如果a改變,b沒有跟著一起改變,那麼就是淺拷貝
那麼在實際開發中我們如何進行深拷貝呢?
分兩種情況
1、對基本資料型別進行深拷貝
基本資料型別: string、number、boolean、null、undefined、symbol
let a =
'123456'
let b = a
a ='abcde'
console.
log(a,b)
//此時a = 'abcde' b = '123456'
這個時候改變a,b不會跟著改變,但是這也算不上深拷貝,因為深拷貝是針對複雜的object型別來說的
2、object型別
let a =[1
,2,3
,4]let b = aa[0
]=10console.
log(a,b)
//此時,a = [10,2,3,4] b = [10,2,3,4]
上面的例子中a改變之後b也改變了,那麼這種時候就是淺拷貝了
接下來我們去實現深拷貝
(1)使用遞迴的方法
// 寫乙個遞迴的拷貝方法
function
deepcopy
(obj)
//除了基本的資料型別,其他型別的使用typeof判斷出來都是object
if(obj &&
typeof obj ===
'object'
)else}}
}return objclone;
}let a =[1
,2,3
,4]let b =
deepcopy
(a)a[0]
=100
console.
log(a,b)
//此時修改a,b不會改變,實現了深拷貝
2、使用json物件的parse和stringify
function
deepclone
(obj)
let a =[1
,2,3
,4]let b =
deepclone
(a)a[0]
=10console.
log(a,b)
//此時修改a,b不會改變,實現了深拷貝
借鑑參考 深拷貝和淺拷貝 具體實現
我們先來說一下淺拷貝 var obj var b obj console.log b 輸出結果為1 這就是淺拷貝 但是淺拷貝會存在乙個問題,我們可以通過 來看一下 var obj var b obj console.log b 我們上面通過淺拷貝拷貝了乙個引用型別,如果我們去修改obj會怎麼樣?va...
淺拷貝和深拷貝具體詳解
當用乙個已經初始化了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫,也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另乙個物件進行初始...
Python淺拷貝和深拷貝以及記憶體分析
淺拷貝和深拷貝 深入了解引數傳遞的底層原理,需要理解一下 淺拷貝和深拷貝 拷貝的內建函式為 copy 淺拷貝 deepcopy 深拷貝 淺拷貝 不拷貝子物件的內容,只是拷貝子物件的引用。深拷貝 會連子物件的記憶體也全部拷貝乙份,對子物件的修改不會影響源物件 例子 import copy def te...