前言
前天乓梨,一次面試,一個(gè)挺專(zhuān)業(yè)的面試官問(wèn)我清酥,如何用原生js方法簡(jiǎn)單實(shí)現(xiàn)深拷貝扶镀?
我一臉問(wèn)號(hào),有么焰轻?然后面試官暗示了我半天臭觉,我說(shuō),莫非你是指Object.assign辱志?
我就有點(diǎn)流汗蝠筑,從沒(méi)聽(tīng)說(shuō)Object.assign跟深拷貝有什么關(guān)系,我又孤陋寡聞了揩懒?
測(cè)試
趕緊查了查資料什乙,經(jīng)過(guò)測(cè)試得知,Object.assign 是淺拷貝旭从。測(cè)試代碼如下:
let a = {name: {asd: '123'}};
let b = Object.assign({}, a);
a = {w: []};
console.log(a); // w: []
let m = {name: {asd: '123'}};
let n = Object.assign({}, m);
m.name = [];
console.log(n); // name: {asd: "123"}
let x = {name: {asd: '123'}};
let y = Object.assign({}, x);
x.name.asd = 456;
console.log(y); // name: {asd: 456}
let p = {name: {asd: {xyz: '123'}}};
let q = Object.assign({}, p);
p.name.asd.xyz = 456;
console.log(p); // name: asd: {xyz: 456}
結(jié)論
所以結(jié)論是:
Object.assign的拷貝稳强,是對(duì)于第一層屬性的拷貝场仲,所以是淺拷貝。
先用Object.freeze凍結(jié)原對(duì)象行不行退疫?
那就要了解一下Object.freeze凍結(jié)原理渠缕,測(cè)試過(guò)程我就不說(shuō)了,結(jié)論是:
Object.freeze也是只能凍結(jié)第一層屬性褒繁。
所以不要有“用Object.freeze先凍結(jié)再深拷貝”的念頭亦鳞!
怎樣才是嚴(yán)謹(jǐn)?shù)纳羁截悾?/h1>
嚴(yán)謹(jǐn)是一個(gè)相對(duì)概念,深拷貝的寫(xiě)法也有N種棒坏,我個(gè)人是采用3種辦法燕差,一個(gè)是JSON.parse(JSON.stringify(obj))
,一個(gè)是去github上找一個(gè)深拷貝的開(kāi)源代碼坝冕,或者是使用lodash的深拷貝就得了徒探。