代码编织梦想

手写实现深拷贝(不考虑循环引用)

function deepClone(obj, newObj) {
  newObj = newObj || {};

  for (let i in obj) {
    if (typeof obj[i] === "object") {
      newObj[i] =
        Object.prototype.toString.call(obj[i]) === "[object Array]" ? [] : {};
      deepClone(obj[i], newObj[i]);
    } else {
      newObj[i] = obj[i];
    }
  }
}

考虑循环引用实现深拷贝

在实现兼容循环引用之前,需要铺垫一下WeakMap的知识,实现的主要原理就是基于WeakMap的。

WeakMap可以算是Map的一个加强版。

同样都是key , value的形式保存变量,WeakMap和Map最大的区别就是,WeakMap是弱引用的,当它的键在外部失去引用时,这组键值对自动删除。

基于WeakMap的原理,我们就可以全面完善深拷贝的代码。
 

function deepClones(origin, map = new WeakMap()) {
  // origin == undefined可以同时判断undefined和null
  if (origin == undefined || typeof origin !== "object") {
    return origin;
  } else if (origin instanceof Date) {
    return new Date(origin);
  } else if (origin instanceof RegExp) {
    return new RegExp(origin);
  } else {
    const key = map.get(origin);

    if (key) {
      return key;
    }

    const target = new origin.constructor();
    map.set(origin, target);
    for (let k in origin) {
      target[k] = deepClones(origin[k], map);
    }
    return target;
  }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65078175/article/details/127000311

关于js深拷贝与浅拷贝的区别,实现深拷贝的几种方法-爱代码爱编程

数据深拷贝是实际项目中你总有一天或者必然会遇到的问题,甚至很多人可能对这两个概念并不是很清晰。简单来说,深拷贝就是把一条数据A复制出来个副本B,修改副本B数据并不会影响原来数据A,浅拷贝则反之,修改数据B会影响到原来的A数据。下面总结下又哪些处理深拷贝的方法? 浅拷贝   为什么会出现上面这种情况? 那么这里,就得引入基本数据类型与引用数据类型

js深拷贝实现-爱代码爱编程

js深拷贝实现 深拷贝:遍历一个对象中所有的属性的值及对象属性中的属性值,不论是嵌套了几层,要完成所有对象属性的递归后,赋值给一个新的对象。 使用递归: function deepCopy (obj) { // 如果被拷贝的是简单数据对象,没必要进行深拷贝 if (typeof obj !== 'object' || obj ===

js-爱代码爱编程

前置条件:函数的调用者的担保 后置条件:保证函数调用的结果 partial(条件,结果) 和 compose(结果,结果) 1. partial import _ from 'underScore' impor