1、深拷贝
修改新变量不会影响原本变量的值
默认情况下基本数据类型都是深拷贝
下面代码只适用于基本数据类型:
class Person{
name="hrl";
age=18;
}
let p1=new Person();
//深拷贝
let p2=new Object();//创建新的对象 在存储中开辟新的存储空间
/*p2.name=p1.name;
p2.age-p1.age;
p2.name="zs";*/ //第一种方法不适合多条数据的时候
/*for(let key in p1){
p2[key]=p1[key];
}
console.log(p2);
p2.name="zs"*/ //第二种方法
Object.assign(p2,p1);
p2.name="zs"
console.log(p1.name);
console.log(p2.name); //推荐使用第三种方法
当不属于基本数据类型时,用上面的方法就不行了。
//不同数据类型 实现真正意义上的深拷贝 需要定义一个方法
class Person{
name="hrl";
cat={
age:18
};
score=[1,3,5];
}
let p1=new Person();
let p2=new Object();
depCopy(p2,p1);
//console.log(p2);
p2.cat.age=25;
console.log(p1.cat.age);
console.log(p2.cat.age);
function depCopy(target,source){
//通过遍历拿到source的属性
for(let key in source){
//console.log(key);//输出不同数据类型的名称
//获得当前数据类型的取值
let sourceValue =source[key];
//console.log(sourceValue);
//判断当前的取值是否是引用数据类型
if(sourceValue instanceof Object){
//console.log(sourceValue);//如果引用了数据类型就输出
//console.log(sourceValue.constructor);
//console.log(new sourceValue.constructor);//判断创建的是对象还是数组
let subTarget=new sourceValue.constructor;
target[key]=subTarget;
depCopy(subTarget,sourceValue);
}else{
target[key]=sourceValue;//没有引用就添加到p2这个对象中
}
}
}
2、浅拷贝
修改新变量的值会影响原本变量的值
默认情况下引用类型都是浅拷贝
let p2=p1;
p2.name="zs";//修改变量中的值