实现深拷贝的两种方法:
1、JSON方法,通过转换JS对象为JSON字符串再还原为JS对象的方式实现,存在无法拷贝函数、undefined、循环引用等问题
2、递归拷贝方法,通过递归实现深拷贝保持原始内容,不会丢失属性
// 深拷贝的方法
// 1、JSON 方法
// 存在的问题:无法拷贝函数、undefined、循环引用等
const obj1 = {
a: 1,
b: [10, 20, 30],
c: undefined,
d: function () { return 42; }
}
// 打印后,obj1.c 和 obj1.d 会丢失
console.log(JSON.parse(JSON.stringify(obj1)));
// 2、递归拷贝
function deepCopy(obj) {
// 如果是原始类型或函数,直接返回
if (obj === null || typeof obj !== 'object') {
return obj;
}
// 处理数组或对象
else {
const copy = Array.isArray(obj) ? [] : {}
for (let key in obj) {
// 确保是对象自身的属性
if (obj.hasOwnProperty(key)) {
// 递归拷贝
copy[key] = deepCopy(obj[key]);
}
}
// 返回拷贝后的对象
return copy;
}
}
// 拷贝后,obj1.c 和 obj1.d 依然存在
const obj2 = deepCopy(obj1)
console.log(obj2, obj2.d());