这是一段深拷贝代码,为什么这里需要用到一个map,而且还是WeakMap。是为了解决什么问题?
function deepClone(obj, hash = new WeakMap()) {
if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
// 可能是对象或者普通的值 如果是函数的话是不需要深拷贝
if (typeof obj !== "object") return obj;
// 循环引用属性的处理
if (hash.get(obj)) return hash.get(obj);
// 是对象的话就要进行深拷贝
let cloneObj = new obj.constructor();
// 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
hash.set(obj, cloneObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 实现一个递归拷贝
cloneObj[key] = deepClone(obj[key], hash);
}
}
return cloneObj;
}
使用 WeakMap 可以解决循环引用的问题
例如下例:
因为递归会导致进入死循环导致栈内存溢出
为什么用WeakMap,不用Map,是为了垃圾回收,WeakMap是弱引用
关于WeakMap详情可参考
https://www.zhangxinxu.com/wo...