JavaScript對象的深淺拷貝

在項目中我們會經(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í)過程是極有好處的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,689評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,286評論 8 265
  • 涼爽的一天,我送完孩子們上學(xué),收拾好屋子,站在陽臺下望,看到了你,拎著手提包,下車了。我沒有欣喜若狂,就覺得一天不...
    漫漫無憂閱讀 306評論 9 7

友情鏈接更多精彩內(nèi)容