// 使用map生成考虑了所有情况的深拷贝函数
function deepClone(obj, map = new WeakMap()) {
// 基本类型直接返回
if (typeof obj !== "object" || obj === null) {
return obj;
}
// 如果map中有obj,直接返回,防止循环引用
if (map.get(obj)) {
return map.get(obj);
}
// 判断obj是数组还是对象,生成对应的cloneObj
let cloneObj = Array.isArray(obj) ? [] : {};
// 以obj为key,cloneObj为value存入map中,防止循环引用
map.set(obj, cloneObj);
// 遍历obj,递归调用deepClone
for (let key in obj) {
// 保证key不是原型的属性
if (obj.hasOwnProperty(key)) {
// 递归调用
cloneObj[key] = deepClone(obj[key], map);
}
}
// 返回拷贝后的对象
return cloneObj;
}
标签:map,obj,函数,cloneObj,key,return,拷贝
From: https://www.cnblogs.com/crispyChicken/p/17262210.html