簡(jiǎn)單意思就是深復(fù)制和淺復(fù)制的區(qū)別
淺拷貝
創(chuàng)建一個(gè)新對(duì)象雁仲,這個(gè)對(duì)象有著原始對(duì)象屬性值的一份精確拷貝垮庐。如果屬性是基本類型银觅,拷貝的就是基本類型的值屿岂,如果屬性是引用類型践宴,拷貝的就是內(nèi)存地址 ,所以如果其中一個(gè)對(duì)象改變了這個(gè)地址爷怀,就會(huì)影響到另一個(gè)對(duì)象阻肩。
ES6中拷貝對(duì)象的方法,接受的第一個(gè)參數(shù)是拷貝的目標(biāo)运授,剩下的參數(shù)是拷貝的源對(duì)象(可以是多個(gè))
語(yǔ)法:Object.assign(target, ...sources)
Object.assign是一個(gè)淺拷貝,它只是在根屬性(對(duì)象的第一層級(jí))創(chuàng)建了一個(gè)新的對(duì)象烤惊,但是對(duì)于屬性的值是仍是對(duì)象的話依然是淺拷貝乔煞,
Object.assign還有一些注意的點(diǎn)是:
1不會(huì)拷貝對(duì)象繼承的屬性
2不可枚舉的屬性
3屬性的數(shù)據(jù)屬性/訪問(wèn)器屬性
4可以拷貝Symbol類型
深拷貝
將一個(gè)對(duì)象從內(nèi)存中完整的拷貝一份出來(lái),從堆內(nèi)存中開(kāi)辟一個(gè)新的區(qū)域存放新對(duì)象,且修改新對(duì)象不會(huì)影響原對(duì)象
下面我們來(lái)舉個(gè)簡(jiǎn)單的例子
let obj1= {
? ? ? ? ? ? name: '張三',
? ? ? ? ? ? age: 18,
? ? ? ? ? ? ? ? ?}
? ? let obj2 = obj1
? ? ?這個(gè)時(shí)候打印 obj2 實(shí)際上就是?{ name: '張三',age: 18 }
我們進(jìn)行簡(jiǎn)單的操作
obj2.name="李四"
現(xiàn)在obj2的name值 =李四, 我們現(xiàn)在打印一下obj1柒室,會(huì)發(fā)現(xiàn) obj1的name屬性也變成了李四渡贾,這個(gè)就可以說(shuō)是淺拷貝,沒(méi)有改變他們的原有值雄右,這種可以說(shuō)就屬于淺拷貝
我們?nèi)绻氚裲bj1的值賦給obj2 并且 改動(dòng)obj2的時(shí)候不改變obj1的情況下應(yīng)該怎么操作
JSON.stringify()??取一個(gè)JSON對(duì)象空骚,并將其轉(zhuǎn)換為JSON字符串。
JSON.parse() 取一個(gè)JSON字符串并將其轉(zhuǎn)換為JavaScript一個(gè)新的對(duì)象
varstr=JSON.stringify(obj1)
varobj2=JSON.parse(str)
也可以寫(xiě)成
varobj2=JSON.parse(JSON.stringify(obj1))
這樣轉(zhuǎn)換可以實(shí)現(xiàn)深拷貝 因?yàn)檗D(zhuǎn)換的是一個(gè)新的對(duì)象不脯,跟最初的obj1不是一個(gè)對(duì)象大家可以自己打印下自己嘗試下