在項目中我們會經(jīng)常遇到這樣的問題,當(dāng)我把一個對象賦值給另一個新的對象的時候,當(dāng)我改變其中一個,另一個數(shù)據(jù)也跟著改變,但是我的需求是只想讓新的對象改變,之前的對象不改變,那么問題來了,我該怎么實現(xiàn)呢?

上邊的問題,我想大家會經(jīng)常遇見,這就是深淺拷貝的問題了,那么我們現(xiàn)在來探討一下什么叫深淺拷貝,如何實現(xiàn)深淺拷貝
,對象的深拷貝會拷貝對象中層層嵌套的對象的屬性。
淺復(fù)制:
淺拷貝是指只拷貝一層對象的屬性,不會拷貝對象中的對象的屬性。下面是一個簡單的淺拷貝實現(xiàn)。

這種方法不能實現(xiàn)數(shù)組的淺拷貝,而且丟失了對象的constructor屬性,這樣的話我們就針對的講construtor也復(fù)制過來

那么我們現(xiàn)在來嘗試一下

結(jié)果如下:

可以正確實現(xiàn)數(shù)組復(fù)制和并且保留constructor了,但細心的你一定發(fā)現(xiàn)了,淺復(fù)制后的對象的 arr2Copy[3] 和 arr2[3] 指向的是一個對象,改變其中一個,同時也會改變另一個。我們想要實現(xiàn)的是復(fù)制,但這并不是復(fù)制呀!
這是淺復(fù)制的一個弊端所在,接下讓我們看看深復(fù)制是怎樣解決這個問題的。
深復(fù)制:
深復(fù)制需要層層遞歸,復(fù)制對象的所有屬性,包括對象屬性的屬性的屬性
如果只是需要簡單地復(fù)制對象的屬性,而不用考慮它的constructor,也不用考慮函數(shù),正則,Data等特殊數(shù)據(jù)類型,那這里有一個深復(fù)制的小trick,兩行代碼即可:

大多數(shù)情況下,上面的就可以滿足要求了,但一些時候,我們需要把函數(shù),正則等特殊數(shù)據(jù)類型也考慮在內(nèi),或者當(dāng)前環(huán)境不支持JSON時,上面的方法也就不適用了。這時,我們可以通過遞歸來實現(xiàn)對象的深層復(fù)制,如下:

這樣就可以完美實現(xiàn)大多數(shù)對象的拷貝
面向?qū)ο蟮木幊陶Z言,其核心是對象,因此深入了解對象的相關(guān)操作,縱向比較異同,對學(xué)習(xí)過程是極有好處的。