1.浅拷贝
通常意义上,对数组和对象的 复制 / 拷贝 浅拷贝的特点:只是简单的复制拷贝
引用数据类型的地址,地址相同的变量,操作引用数据类型,彼此都会有影响 例如:
let obj1 = {name : '常威',age : 20};
let obj2 = obj1;
obj2.name = '来福';
obj2.age = 22;
console.log(obj1);//输出结果:{name: "来福", age: 22}
我们通过修改 obj2 中的数据, obj1的数据也会发生改变
因为 obj1 和 obj2 中存储的是相同的内存地址,指向的是一个相同的数组
如果 obj1 和 obj2 任意的数据发生改变,都会影响另外一个变量的输出
2.深拷贝
对数组和对象的数值进行拷贝,而不拷贝引用数据类型内存地址,这样当我们操作
某一个数据类型的时候 另外一个的数值就不会发生改变
let obj1 = {name : '常威',age : 20};
let obj2 = {name:obj1.name,age:obj1.age};
obj2.name = '来福';
obj2.age = 22;
console.log(obj1,obj2);//输出结果:{name: "常威", age: 20},{name: "来福", age: 22}
3.通过 ES6 面向对象的构造方法来了解深浅拷贝
浅拷贝
class Data{
constructor(year,month,day) {
this.year = year;
this.month = month;
this.day = day;
}
}
// 浅拷贝
// 生成实例化对象
let data1 = new Data('2020','2','29');
let data2 = data1;
// 修改 data2 中的数据, data1 也会相应的发生改变
data2.year = '2200';
data2.month = '12';
data2.day = '31';
console.log(data1.year + '年' + data1.month + '月' + data1.day + '日'); //输出结果2200年12月31日
console.log(data2.year + '年' + data2.month + '月' + data2.day + '日'); //输出结果2200年12月31日
深拷贝
class Data{
constructor(year,month,day) {
this.year = year;
this.month = month;
this.day = day;
}
// 拷贝构造方法
clone(){
let d = new Data(this.year,this.month,this.day);
return d;
}
}
// 浅拷贝
// 生成实例化对象
let data1 = new Data('2020','2','29');
// 此时 data2 拷贝 data1 中的构造方法 , 也就是只拷贝了数据,而不是拷贝的内存地址
let data2 = data1.clone();
// 所以此时修改 data2 的数据, data1 的数据就不会发生改变
data2.year = '2200';
data2.month = '12';
data2.day = '31';
console.log(data1.year + '年' + data1.month + '月' + data1.day + '日'); //输出结果2020年2月29日
console.log(data2.year + '年' + data2.month + '月' + data2.day + '日'); //输出结果2200年12月31日