簡單意思就是深復(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不是一個對象大家可以自己打印下自己嘗試下