深拷贝和浅拷贝
2020-08-30 本文已影响0人
释梦石
概念
浅拷贝:只拷贝最外面一层的数据;更深层次的对象,只拷贝引用。
深拷贝:拷贝多层数据;每一层级别的数据都会拷贝。
浅拷贝
for...in实现
for...in浅拷贝Object.assgin() 实现
ES6 中,我们通过 Object.assgin() 可以实现浅拷贝。
obj2 = Object.assgin(obj2, obj1);
将obj1 拷贝给 obj2。执行完毕后,obj2 的值会被更新。也就是将 obj1 的值追加到 obj2 中。如果对象里的属性名相同,obj2中的属性值会被覆盖
Object.assign()实现浅拷贝 浅拷贝,返回值可以不用接收深拷贝
深拷贝的实现本质上是对浅拷贝进行递归来实现的
let obj1 = {
name: 'zhudzhi',
age: 28,
info: {
hob: 'test',
},
};
//name属性值会被覆盖
let obj2 = {
name: 'newName',
sex: 'nv'
};
obj2 = deepCopy(obj2, obj1);
//定义一个函数,做浅拷贝
function deepCopy(obj2,obj1){
for(let key in obj1){
let items = obj1[key];
if(items instanceof Array){
// 当key是一个数组时,再次把数组里的值拷贝到obj2[key]里
obj2[key] = [];
deepCopy(obj2[key],items)
}else if(items instanceof Object){
//当key是一个对象时,再次拷贝
obj2[key] = {};
deepCopy(obj2,items)
}else{
//简单数据类型直接拷贝
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));
打印结果:
image.png