在JS中拷貝蚀之、復(fù)制一個(gè)對(duì)象的方式有多種,我常用的一般是 Object.assign({},sourceObj)捷泞。
Object.assign()因?yàn)?Object.assign()拷貝的是屬性值足删。假如源對(duì)象的屬性值是一個(gè)對(duì)象的引用,那么它也只指向那個(gè)引用锁右。如果合并的對(duì)象是多層嵌套對(duì)象那就屬于淺拷貝了失受,修改內(nèi)層對(duì)象的值還是會(huì)影響原對(duì)象。
要想實(shí)現(xiàn)深度復(fù)制可以使用JSON方式咏瑟。
寫(xiě)法如下:
let newObj = JSON.parse(JSON.stringify(sourceObj))//深度復(fù)制對(duì)象
它的原理是把JS對(duì)象轉(zhuǎn)換為JSON字符串拂到,再由JSON字符串轉(zhuǎn)換為JS對(duì)象,這樣新對(duì)象的指針就不會(huì)指向原對(duì)象的指針了码泞。但這種也有副作用的兄旬,有一下幾點(diǎn)副作用:
1、有屬性包含時(shí)間對(duì)象余寥,拷貝后就是字符串的形式辖试。
2、有函數(shù)或undefined劈狐,拷貝后會(huì)丟失。
3呐馆、有RegExp和Error對(duì)象肥缔,拷貝后變?yōu)榭諏?duì)象。
4汹来、存在循環(huán)引用的情況续膳,沒(méi)法正確拷貝。
5收班、內(nèi)層對(duì)象是構(gòu)造函數(shù)生成的坟岔,會(huì)丟失constructor。
6摔桦、屬性值為NaN社付、Infinity承疲,拷貝后變?yōu)閚ull。
雖然有些副作用鸥咖,但大多情況還是符合要求可以使用燕鸽。