// 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
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、浅复制与深复制的概念 1、浅复制 被复制的对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然...
- 这是上一篇 [JavaScript] 引用 vs 复制 的后续。 浅克隆 上一篇中说的 = 和 Object.as...
- __clone()是在clone对象时自动调用的方法。以上程序执行结果如下: 如图$p1和$p2是一样的,注意开头...