1.什么是深拷贝,什么是浅拷贝?
1.1深拷贝
修改新变量的值不会影响原有变量的值;
默认情况下基本数据类型都是深拷贝;
1.2浅拷贝
修改新变量的值会影响原有的变量的值;
默认情况下引用类型都是浅拷贝;
// 深拷贝
let num1 = 123;
let num2 = num1;
num2 = 666; // 修改新变量的值
console.log(num1); // 123
console.log(num2); // 666
// 浅拷贝
class Person{
name = "abc";
age = 22;
}
let p1 = new Person();
let p2 = p1;
p2.name = "zs"; // 修改变量的值
console.log(p1.name); // zs
console.log(p2.name); // zs
2. assign方法可以将第二个参数的对象的属性和方法拷贝到第一个参数的对象中
例:
Object.assign(p2, p1);
// console.log(p2);
p2.name = "zs";
console.log(p1.name);
console.log(p2.name);
// 注意点: 当只有被拷贝对象中所有属性都是基本数据类型时, 以上代码才是深拷贝
- 当有对象或数组时(拷贝后会指向同一个原型对象,修改新变量参数同样会影响之前变量的值)(下面方法为真正的深拷贝):
class Person{
name = "abc";
cat = {
age : 3
};
scores = [1, 3, 5];
}
let p1 = new Person();
let p2 = new Object();
depCopy(p2, p1);
p2.cat.age = 666;
console.log(p1.cat.age);
console.log(p2.cat.age);
function depCopy(target, source) {
// 1.通过遍历拿到source中所有的属性
for(let key in source){
// console.log(key);
// 2.取出当前遍历到的属性对应的取值
let sourceValue = source[key];
// console.log(sourceValue);
// 3.判断当前的取值是否是引用数据类型
if(sourceValue instanceof Object){
// console.log(sourceValue.constructor);
// console.log(new sourceValue.constructor);
let subTarget = new sourceValue.constructor; // 创建新的原型对象
target[key] = subTarget;
depCopy(subTarget, sourceValue);
}else{
target[key] = sourceValue;
}
}
}
-End