美文网首页
使用WeakMap解决deepClone遇到循环引用对象时产生的

使用WeakMap解决deepClone遇到循环引用对象时产生的

作者: TerdShow | 来源:发表于2019-07-23 10:48 被阅读0次
const deepClone = (value, hash=new WeakMap) => {
  if(value == null) return value;
  if(value instanceof RegExp) return new RegExp(value);
  if(value instanceof Date) return new Date(value);
  if(typeof value != 'object') return value;
  let obj = new value.constructor();
  if(hash.get(value)){
    return hash.get(value);
  }
  hash.set(value, obj);
  for(var k in value) {
    if(value.hasOwnProperty(k)){
      obj[k] = deepClone(value[k], hash);
    }
  }
  return obj;
}

let a = {
  m: 1,
  n:{
    x:12,
    y:13
  }
}

let b =  deepClone(a);

b.m = 100;

console.log(b);
console.log(a);

相关文章

  • 使用WeakMap解决deepClone遇到循环引用对象时产生的

  • iOS 内存管理面试题(循环引用)

    循环引用 循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。 如何解决循环引用? 1、避免产生循环引用...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • 深拷贝

    准备 WeakMap类型WeakMaps 保持了对键名所引用的对象的弱引用,而且WeakMap 只接受对象作为键名...

  • 你真的了解循环引用吗?

    循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。 如何解决循环引用? 1、避免产生循环引用,通常是将...

  • Swift循环引用的解决方案

    解决实例之间的循环强引用,Swift 提供了两种办法用来解决你在使用类的属性时所遇到的循环强引用问题:弱引用(we...

  • Block 循环引用(上)

    使用block时什么情况会发生引用循环,如何解决? 一个对象中强引用了block,在block中又强引用了该对象,...

  • JS深拷贝

    深拷贝,拷贝引用对象的引用对地址和栈。先编辑deepClone.js文件 在html中引入deepClone.js...

  • iOS底层 -- Blcok本质之循环引用

    一、产生循环引用的原因 由图可知,person对象强引用block,block强引用person对象,形成循环引用...

  • Block底层原理

    循环引用 对象持有Block, Block 又捕获该对象 __weak不会产生强引用,指向的对象销毁时,会自动将指...

网友评论

      本文标题:使用WeakMap解决deepClone遇到循环引用对象时产生的

      本文链接:https://www.haomeiwen.com/subject/xcfolctx.html