区别
两者之间的区别:假设A复制了B,B发生了改变,A也跟着改变,就是浅拷贝,如果A没有变化,那就是深拷贝
深拷贝
{
let a = 10;
let b = a;
a = 9;
console.log(a, b)
}
结果为:
9 10
这里b复制了a的值,a发生了改变,b还是原来a的值,这个就是深拷贝
浅拷贝
浅拷贝一般出现在数据类型为对象中,因为基本上类型Number、String、Boolean是按值传递,而对象是按引用传值
const obj1 = { a : 1, b : 2}
const obj2 = obj1;
obj1.a = 2;
console.log(obj1); // { a:2, b:2 }
console.log(obj2); // { a:2, b:2 }
这里对象obj1赋值给obj2,改变obj1中a的值,obj2也跟着改变了,这就是浅拷贝
解决浅拷贝的方法如下:
方法1:
{
const obj1 = { a : 1, b : 2}
const obj2 = { a: obj1.a, b: obj1.b };
obj1.a = 2;
console.log(obj1); // { a:2, b:2 }
console.log(obj2); // { a:1, b:2 }
}
这个方法就是一个个赋值过来,如果值不多还好,值多就很麻烦
方法2:
const obj1 = { a : 1, b : 2}
const obj2 = JSON.parse(JSON.stringify(obj1));
obj1.a = 2;
console.log(obj1); // { a:2, b:2 }
console.log(obj2); // { a:1, b:2 }
转成字符串,再转成json,但是这个方法只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON,RegExp对象是无法通过这种方式深拷贝
方法3:
var deepCopy= function(source) {
var result={};
for (var key in source) {
result[key] = typeof source[key]=== 'object'? deepCopy(source[key]): source[key];
}
return result;
}
const obj1 = { a : 1, b : 2, newobj: { a: 1 }}
const obj2 = deepCopy(obj1)
obj1.newobj.a = 2;
console.log(obj1); // { a : 1, b : 2, newobj: { a: 2 }}
console.log(obj2); // { a : 1, b : 2, newobj: { a: 1 }}
这个方法就是递归拷贝,这个方法还是挺经常用到的
除了上面三种方法之外,还有一个方法就是引入lodash,里面有提供cloneDeep来实现深拷贝