在js中侦香,怎么用一行代碼實現(xiàn)深拷貝刻获?它可以實現(xiàn): JSON.parse(JSON.stringify(obj))罐脊。
這行代碼的運行過程承绸,就是利用 JSON.stringify 將js對象序列化(JSON字符串)褐望,再使用JSON.parse來反序列化(還原)js對象勒庄;序列化的作用是存儲和傳輸。(對象本身存儲的是一個地址映射瘫里,如果斷電实蔽,對象將不存在,所以要將對象的內(nèi)容轉(zhuǎn)換成字符串的形式再保存在磁盤上)
不過谨读,這種實現(xiàn)深拷貝的方法有局限性局装,它只適用于一般數(shù)據(jù)的拷貝(對象、數(shù)組)漆腌,有以下情況需要注意:
1.如果json里面有時間對象贼邓,則序列化結(jié)果:時間對象=>字符串的形式;
let obj = {
age: 18,
date: new Date()
};
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
console.log(typeof obj.date); // object
console.log(typeof objCopy.date); // string
2.如果json里有RegExp闷尿、Error對象塑径,則序列化的結(jié)果將只得到空對象 RegExp、Error => {}填具;
let obj = {
age: 18,
reg: new RegExp('\\w+'),
err: new Error('error message')
};
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
3.如果json里有 function,undefined统舀,則序列化的結(jié)果會把 function,undefined 丟失;
let obj = {
age: 18,
fn: function () {
console.log('fn');
},
hh: undefined
};
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
4.如果json里有NaN劳景、Infinity和-Infinity誉简,則序列化的結(jié)果會變成null;
let obj = {
age: 18,
hh: NaN,
isInfinite: 1.7976931348623157E+10308,
minusInfinity: -1.7976931348623157E+10308
};
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
5.如果json里有對象是由構(gòu)造函數(shù)生成的盟广,則序列化的結(jié)果會丟棄對象的 constructor闷串;
function Person(name) {
this.name = name;
}
let obj = {
age: 18,
p1: new Person('lxcan')
};
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
console.log(obj.p1.__proto__.constructor === Person); // true
console.log(objCopy.p1.__proto__.constructor === Object); // true
6.如果對象中存在循環(huán)引用的情況也無法實現(xiàn)深拷貝
let obj = {
age: 18
};
obj.obj = obj;
let objCopy = JSON.parse(JSON.stringify(obj));
console.log('obj', obj);
console.log('objCopy', objCopy);
以上,如果拷貝的對象不涉及上面的情況筋量,可以使用 JSON.parse(JSON.stringify(obj)) 實現(xiàn)深拷貝烹吵。
關(guān)于js深拷貝的相關(guān)知識以及更多解決方案碉熄,可以閱讀這篇文章 深拷貝的終極探索(99%的人都不知道)