// node xxx.js
// babel-node xxx.js (ES6)
// 浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
// 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变
// 数组浅拷贝:arr.slice(0)、arr.concat() 【实际上是一层深拷贝,若数组元素为引用类型则只拷贝引用指针】
// 数组深拷贝:[...arr2] = arr1;
// 对象拷贝
// Object.create() 、Object.assign() 实现浅拷贝及一层的深拷贝(只复制第一层属性)
// JSON.stringify()、JSON.parse()实现对象深拷贝(有局限性)
// 递归实现
// lodash.js 库的_.cloneDeep函数
function deepCopy(object) {
// null 或 非 对象,则返回本身
if (object === null || typeof object !== "object") {
return object;
}
// 处理对象
if (typeof object === "object") {
// 判断是对象是否为数组
let res = object instanceof Array ? [] : {};
// 遍历数组或对象
for (let i in object) {
// 若对象属性等于自身时,应该跳过,否则死循环
if (object[i] == object) continue;
// 若数组元素或对象属性值为对象,则递归
res[i] = typeof object[i] === "object" ? deepCopy(object[i]) : object[i];
}
return res;
}
}
a = {
name: "zq",
hobbies: {
sports: ["Table tennis", "Swimming"],
amusement: ["Singing", "Dance"]
}
};
obj2 = deepCopy(a); // {}
console.log(obj2);