美文网首页
js深拷贝、循环引用解决

js深拷贝、循环引用解决

作者: 不得不爱XIN | 来源:发表于2019-06-28 16:53 被阅读0次
function deepCopy(obj) {
  // hash表,记录所有的对象的引用关系
  let map = new WeakMap();
  
  function dp(obj) {
    let result = null;
    let keys = Object.keys(obj);
    let key = null,
      temp = null,
      existobj = null;

    existobj = map.get(obj);
    //如果这个对象已经被记录则直接返回
    if (existobj) {
      return existobj;
    }

    result = {}
    map.set(obj, result);

    for (let i = 0, len = keys.length; i < len; i++) {
      key = keys[i];
      temp = obj[key];
      if (temp && typeof temp === 'object') {
        result[key] = dp(temp);
      } else {
        result[key] = temp;
      }
    }
    return result;
  }


  return dp(obj);
}

测试用例


const obj1 = {
  x: 1
}
// obj1.z = obj1;

const obj2 = {
  x: 2
}

obj1.next = obj2;
obj2.next = obj1;


const obj3 = deepCopy(obj1);

console.log(obj3)

相关文章

  • js深拷贝、循环引用解决

    测试用例

  • Javascript常见API实现

    JS 深拷贝的实现 简易版 问题 WARNING无法解决循环引用的问题,无限递归导致系统栈溢出无法拷贝特殊的对象,...

  • 手写代码Two

    深拷贝、 hash解决深拷贝,循环引用 new 操作符做了这些事: 创建一个全新的对象,这个对象的 proto 要...

  • JS深拷贝

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

  • js递归实现深拷贝 代码优化(解决循环引用)

    首先回顾一下之前实现的深拷贝的代码: 01.循环引用问题 我们看下面这个例子 这段代码运行将会报错,因为循环引用造...

  • 通过jQuery中.extend()方法理解深拷贝

    所谓深拷贝和浅拷贝最大的区别就是js中有简单类型和引用类型的区分,对于简单类型不存在深拷贝和浅拷贝的区分,对于引用...

  • Vue3+TS Day05 - 基础指令 深拷贝、浅拷贝、v-m

    一、深拷贝、浅拷贝 1、什么是对象的引用赋值? js 中对象都是引用类型的image.png 2、什么是浅拷贝? ...

  • JS深拷贝的实现

    JS深拷贝, 即传值拷贝, 需要新建一处内存,实现拷贝,具体实现如下: //ES5深拷贝 (1)循环递归: fun...

  • js数据类型

    JS基本数据类型和引用数据类型(JS 基本数据类型和引用数据类型的区别及浅拷贝和深拷贝) 再讲 js 的基本数据类...

  • js引用类型深拷贝

    一、js数据类型 js的数据类型可以简单的概括为两大类:原始类型和引用类型。原始类型包括:Undefined、Nu...

网友评论

      本文标题:js深拷贝、循环引用解决

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