19.深拷貝和淺拷貝

簡單意思就是深復(fù)制和淺復(fù)制的區(qū)別

淺拷貝

創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。如果屬性是基本類型,拷貝的就是基本類型的值,如果屬性是引用類型,拷貝的就是內(nèi)存地址 ,所以如果其中一個對象改變了這個地址,就會影響到另一個對象。

ES6中拷貝對象的方法,接受的第一個參數(shù)是拷貝的目標(biāo),剩下的參數(shù)是拷貝的源對象(可以是多個)

語法:Object.assign(target, ...sources)

Object.assign是一個淺拷貝,它只是在根屬性(對象的第一層級)創(chuàng)建了一個新的對象,但是對于屬性的值是仍是對象的話依然是淺拷貝,

Object.assign還有一些注意的點是:

1不會拷貝對象繼承的屬性

2不可枚舉的屬性

3屬性的數(shù)據(jù)屬性/訪問器屬性

4可以拷貝Symbol類型

深拷貝

將一個對象從內(nèi)存中完整的拷貝一份出來,從堆內(nèi)存中開辟一個新的區(qū)域存放新對象,且修改新對象不會影響原對象

下面我們來舉個簡單的例子


let obj1= {

? ? ? ? ? ? name: '張三',

? ? ? ? ? ? age: 18,

? ? ? ? ? ? ? ? ?}

? ? let obj2 = obj1

? ? ?這個時候打印 obj2 實際上就是?{ name: '張三',age: 18 }

我們進(jìn)行簡單的操作

obj2.name="李四"

現(xiàn)在obj2的name值 =李四, 我們現(xiàn)在打印一下obj1,會發(fā)現(xiàn) obj1的name屬性也變成了李四,這個就可以說是淺拷貝,沒有改變他們的原有值,這種可以說就屬于淺拷貝

我們?nèi)绻氚裲bj1的值賦給obj2 并且 改動obj2的時候不改變obj1的情況下應(yīng)該怎么操作

JSON.stringify()??取一個JSON對象,并將其轉(zhuǎn)換為JSON字符串。

JSON.parse() 取一個JSON字符串并將其轉(zhuǎn)換為JavaScript一個新的對象

varstr=JSON.stringify(obj1)

varobj2=JSON.parse(str)

也可以寫成

varobj2=JSON.parse(JSON.stringify(obj1))

這樣轉(zhuǎn)換可以實現(xiàn)深拷貝 因為轉(zhuǎn)換的是一個新的對象,跟最初的obj1不是一個對象大家可以自己打印下自己嘗試下

最后編輯于
?著作權(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)容

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