js手写深拷贝

1、先看一下直接赋值的,直接进行地址的赋值,

//1、这个是直接进行赋值,所以两个的地址值是指向同一个,所以进行修改就会修改到原来的
        const target = {
          name: "lin",
        };

        const newObj = target;
        target.name = "xxx"; // 改变原来的对象

        console.log("原来的对象", target);
        console.log("新的对象", newObj);

        console.log("两者指向同一地址", target == newObj);

2、进行浅拷贝的,第一层是开辟空间进行新的赋值,深层的就是地址的复制。

// 2、这个是进行浅复制,和上面的直接赋值的不一样,指向不同的地址,但是仅仅就复制这一层,深的还是指向同一个地址。
        import { clone } from "lodash";

        const target = {
          name: "lin",
        };

        const newObj = clone(target);
        target.name = "xxx"; // 改变原来的对象

        console.log("原来的对象", target);
        console.log("新的对象", newObj);

        console.log("两者指向同一地址", target == newObj);

3、深拷贝手写

// 3、深拷贝,是无论有多少层,都将其完整复制,即将其进行开辟新地址

      function deepCopy(target, map = new Map()) {
        if (target === null) return target; // 如果是null 就不需要进行拷贝操作
        if (typeof target !== "object") return target; // 处理原始类型和函数 不需要深拷贝,直接返回
        // 是引用类型就要进行赋值了
        // 为了避免循环引用的问题,使用map来进行存储,比如说 var a = {a}, var b = deepCopy(a),
        if (map.has(target)) {
          return map.get(target);
        }
        // 创建一个新的克隆对象或克隆数组
        var res = new target.constructor();
        map.set(target, res);
        // for (let key in target) { //因为forin是看不到Symbol的,所以说就是不能使用froin,所以使用Reflect.ownKeys
        //   if (target.hasOwnProperty(key)) {
        //     res[key] = deepCopy(target[key], map);
        //   }
        // }
        Reflect.ownKeys(target).forEach((key) => {
          res[key] = deepCopy(target[key], map);
        });

        return res;
      }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值