概念
淺拷貝:只拷貝最外面一層的數(shù)據(jù)拴曲;更深層次的對象方咆,只拷貝引用票编。
深拷貝:拷貝多層數(shù)據(jù)褪储;每一層級別的數(shù)據(jù)都會拷貝。
淺拷貝
for...in實(shí)現(xiàn)
for...in淺拷貝
Object.assgin() 實(shí)現(xiàn)
ES6 中慧域,我們通過 Object.assgin() 可以實(shí)現(xiàn)淺拷貝鲤竹。
obj2 = Object.assgin(obj2, obj1);
將obj1 拷貝給 obj2。執(zhí)行完畢后,obj2 的值會被更新辛藻。也就是將 obj1 的值追加到 obj2 中碘橘。如果對象里的屬性名相同,obj2中的屬性值會被覆蓋
Object.assign()實(shí)現(xiàn)淺拷貝
淺拷貝吱肌,返回值可以不用接收
深拷貝
深拷貝的實(shí)現(xiàn)本質(zhì)上是對淺拷貝進(jìn)行遞歸來實(shí)現(xiàn)的
let obj1 = {
name: 'zhudzhi',
age: 28,
info: {
hob: 'test',
},
};
//name屬性值會被覆蓋
let obj2 = {
name: 'newName',
sex: 'nv'
};
obj2 = deepCopy(obj2, obj1);
//定義一個函數(shù)痘拆,做淺拷貝
function deepCopy(obj2,obj1){
for(let key in obj1){
let items = obj1[key];
if(items instanceof Array){
// 當(dāng)key是一個數(shù)組時,再次把數(shù)組里的值拷貝到obj2[key]里
obj2[key] = [];
deepCopy(obj2[key],items)
}else if(items instanceof Object){
//當(dāng)key是一個對象時,再次拷貝
obj2[key] = {};
deepCopy(obj2,items)
}else{
//簡單數(shù)據(jù)類型直接拷貝
obj2[key] = items;
}
}
//返回深拷貝的對象
return obj2;
}
console.log('obj2:' + JSON.stringify(obj2));
obj1.name = 'newName';
console.log('obj1:' + JSON.stringify(obj1));
console.log('obj2:' + JSON.stringify(obj2));
打印結(jié)果:
image.png