JS递归实现深拷贝
思路:遍历对象判断值是否为对象或者数组,如果值为简单数据类型则直接赋值,否则重复调用递归函数继续复制拷贝。
let testObj = {
name: "張三",
age: 20,
null_keys: null,
arr: [1, 2, 3, 4],
foo() {
console.log("name")
}
};
// 递归深拷贝 不考虑集合映射
function cloneFoo(obj, newsObj = {}) {
// 遍历拿到所有的键名 getOwnPropertyNames可以拿到不可遍历属性名
Object.getOwnPropertyNames(obj).forEach(key => {
// 判断是否为复杂数据类型 以及防止null
if (typeof obj[key] == "object" && obj[key]) {
// 判断原型 数组给初始化空数组
if (obj[key] instanceof Array) {
newsObj[key] = []
} else {
// 对象给初始化空对象
newsObj[key] = {}
}
//递归函数
cloneFoo(obj[key], newsObj[key])
//方法直接赋值
} else if (obj[key] instanceof Function) {
newsObj[key] = obj[key]
} else {
// 一般数据类型直接赋值
newsObj[key] = obj[key];
}
})
return newsObj
}
let cloneObj = cloneFoo(testObj);
// 检测是否克隆成功
cloneObj.arr.pop();
console.log(cloneObj.arr);// [1, 2, 3]
console.log(testObj.arr);//[1,2,3,4]