深拷贝
修改新变量的值不会影响原有变量的值
默认情况下基本数据类型都是深拷贝
浅拷贝
修改新变量的值会影响原有的变量的值
默认情况下引用类型都是浅拷贝
Object.assign()方法
let obj1 = {
a: {
b: 1
},
c: 2
}
let obj2 = new Object();
Object.assign(obj2 ,obj1)
obj2.a.b = 3;
obj2.c = 3
console.log(obj1.a.b); // 3
console.log(obj2.a.b); // 3
console.log(obj1.c); // 2
console.log(obj2.c); // 3
Object.assign(obj1, obj2)方法可以将第二个参数的对象的属性和方法拷贝到第一个参数的对象中
注意点: 只有被拷贝对象中所有属性都是基本数据类型, 才是深拷贝
JSON.parse和JSON.stringify方法
let obj1 = {
a : 1,
b : {
c : 2
}
};
let obj2 = JSON.parse(JSON.stringify(obj1))
obj2.b.c = 3;
console.log(obj1.b.c); // 2
console.log(obj2.b.c); // 3
注意点:这种方式会抛弃对象的constructor,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。这种方法适用于能转成JSON格式的对象,如对象、数组, 像Function没办法转成JSON就无法使用
递归实现深拷贝
function deepCopy(target, source) {
// 1.遍历获取source中的所有属性
for (let key in source){
// 2.取出当前遍历到的属性的取值
let sourceValue = source[key];
// 3.判断当前的取值是否为引用类型
if(sourceValue instanceof Object){
// 通过constructor获取当前对象的构造函数,并new一个新对象
let subTarget = new sourceValue.constructor;
deepCopy(subTarget, sourceValue);
target[key] = subTarget;
}else {
target[key] = sourceValue;
}
}
}