声明一个对象 aa,
let aa = {
name: '李白',
say() {
console.log(this.name + '乘舟将欲行');
}
}
再声明一个变量 bb,另 bb = aa;
let bb = aa;
此时,bb.name; // 李白
更改bb的name属性,则aa对象的name属性也会跟着改变,
通过 对象深拷贝 解决
1. 使用JSON序列化+格式化实现
let bb = JSON.parse(JSON.stringify(aa));
缺点:
- 函数、undefined序列化时会丢失
- 时间对象序列化之后不能再反序列化回去
- 正则、Error对象,序列化时只能得到空对象
- 只能序列化对象的可枚举的自由属性
2.手动实现深拷贝方法
function deepClone(obj) {
if (typeof obj != 'object' || obj == null){
return obj;
}
let result;
if (obj instanceof Array) {
result = [];
} else {
result = {}
}
for (let key in obj){
if (obj.hasOwnProperty(key)){
result[key] = deepClone(obj[key]);
}
}
return result;
}
可以看到,通过 deepClone 赋值的 bb2,改变name,aa不会跟着改变,深拷贝实现。