淺談深拷貝與淺拷貝

簡(jiǎn)單來(lái)說(shuō),深拷貝主要是將另一個(gè)對(duì)象的屬性值拷貝過(guò)來(lái)之后,另一個(gè)對(duì)象的屬性值并不受到影響,因?yàn)榇藭r(shí)它自己在堆中開(kāi)辟了自己的內(nèi)存區(qū)域,不受外界干擾。

? ? ? 淺拷貝主要拷貝的是對(duì)象的引用值,當(dāng)改變對(duì)象的值,另一個(gè)對(duì)象的值也會(huì)發(fā)生變化。

? ? ? 我們看一個(gè)基本數(shù)據(jù)類(lèi)型的列子,let a = 1命令會(huì)在棧內(nèi)存中開(kāi)辟一塊區(qū)域,之后拷貝一個(gè)a對(duì)象給b,如圖所示

? ? ? 我們可以看到,在棧內(nèi)存中也為b開(kāi)辟了一塊內(nèi)存區(qū)域,此時(shí)a,b的賦值互不干擾,當(dāng)改變a對(duì)象屬性值時(shí)b不受影響,這其實(shí)就完成了我們所謂的簡(jiǎn)單深拷貝,但并不能完全稱(chēng)作深拷貝,因?yàn)樯羁截惐旧砭歪槍?duì)的是復(fù)雜的Object類(lèi)型數(shù)據(jù),并且深拷貝需要將屬性的各個(gè)層級(jí)都要拷貝過(guò)來(lái),剛剛的例子只有一個(gè)層級(jí)。

? ? ? 我們開(kāi)看一個(gè)js中的slice()方法,這個(gè)方法其實(shí)并不能達(dá)到完全的深拷貝,

? ? ? 可以看到,當(dāng)改變a[0]的值后,打印處a的值改變?yōu)閇2,2,3,4],b的值并不受到影響,仍然是[1,2,3,4],可以深拷貝成功,slice()這個(gè)方法表面上具有深拷貝的功能,但之后換一個(gè)多一層級(jí)別的數(shù)組,


? ? ? ? ? ? 可以看出,slice()這個(gè)方法拷貝的并不徹底,一級(jí)屬性可以完全拷貝過(guò)來(lái),不受a改變的影響,但是二級(jí)屬性還是沒(méi)能拷貝成功,仍然脫離不了a的控制,說(shuō)明slice根本不是真正的深拷貝。同理,concat方法與slice也存在這樣的情況,他們都不是真正的深拷貝,這里需要注意。說(shuō)一下,JSON.stringify與JSON.parse可以實(shí)現(xiàn)深拷貝。

接下來(lái)可以借引用數(shù)據(jù)類(lèi)型來(lái)說(shuō)一下淺拷貝,淺拷貝其實(shí)沒(méi)有什么特別之處,如圖所示


淺拷貝其實(shí)拷貝的是它的引用地址,let a = [0,1,2,3,4,5];? b = a;?

b拷貝了a在棧中的堆地址,都指向a在堆中的屬性值,當(dāng)a數(shù)組放生改變時(shí),b屬性值也會(huì)改變,因?yàn)閎也指向相同的堆內(nèi)存。

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,666評(píng)論 1 32
  • 寫(xiě)在前面 各類(lèi)技術(shù)論壇關(guān)于深拷貝的博客有很多,有些寫(xiě)的也比我好,那為什么我還要堅(jiān)持寫(xiě)這篇博客呢,之前看到的一篇博客...
    心_c2a2閱讀 21,494評(píng)論 3 18
  • 小編已經(jīng)更新了代碼部分,戳這里 一、數(shù)據(jù)類(lèi)型 數(shù)據(jù)分為基本數(shù)據(jù)類(lèi)型(String, Number, Boolean...
    grain先森閱讀 2,803評(píng)論 2 53
  • 轉(zhuǎn)載于:https://www.cnblogs.com/echolun/p/7889848.html 【JS】深拷...
    馬兒_adcf閱讀 471評(píng)論 0 0
  • 如何區(qū)分深拷貝與淺拷貝,簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是假設(shè)B復(fù)制了A,當(dāng)修改A時(shí),看B是否會(huì)發(fā)生變化,如果B也跟著變了,說(shuō)明這是...
    文朝明閱讀 2,138評(píng)論 0 3

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