deep clone
作者:
皮神雷卡丘 | 来源:发表于
2019-10-18 15:46 被阅读0次// WeakMap 弱引用引用的对象的其他引用被清除,垃圾回收机制就会释放该对象所占用的内存。并且键只能为obj
export const _deepClone = (obj, hash = new WeakMap()) => {
// 如果是正则或者 日期类型 直接返回一个新的实例
if(obj instanceof RegExp) return new RegExp(obj);
if(obj instanceof Date) return new Date(obj);
// 如果不是对象
if(obj === null || typeof obj !== 'object'){
return obj;
}
// 如果map里有此上一级对象的子属性key 如果此子对象 == 祖对象
if(hash.has(obj)){
console.log(obj);
return hash.get(obj);
}
// 用obj.constructor()则 如果是对象就是对象的构造函数 如果是数组 就是数组的构造函数
// 简而言之 就是构造一个此obj类型的 空实例
let t = new obj.constructor();
// 空实例 的对应键 key 为此对象
hash.set(obj,t);
// 遍历obj的属性
for(let k in obj){
if(obj.hasOwnProperty(k)){
//1. 递归开始hash 为 {key(原对象):val:(空对象实例)}
//2. 新实例对应属性克隆赋值
//3. 逐个对象克隆赋值, 逐个里面对子属性如果有对象再逐层clone
t[k] = _deepClone(obj[k],hash);
}
}
return t;
}
本文标题:deep clone
本文链接:https://www.haomeiwen.com/subject/aqkymctx.html
网友评论