一个完美的深拷贝

该文章提供了一个JavaScript函数用于实现深度克隆,能处理包括null、日期、Set、Map、正则表达式、HTML元素以及复杂对象在内的各种数据类型。函数通过递归方式复制对象,确保原始对象和克隆对象之间的独立性。在测试代码中,展示了对不同类型的数据进行深拷贝的示例。
摘要由CSDN通过智能技术生成
    function deepClone(target, map = new WeakMap()) {
      if (target === null) return target;
      if (target instanceof Date) return new Date(target);
      if (target instanceof Set) return new Set([...target]);
      if (target instanceof Map) return new Map([...target]);
      if (target instanceof RegExp) return new RegExp(target);
      if (target instanceof HTMLElement) return target;

      if (typeof target !== "object") return target;

      if (map.get(target)) return map.get(target);
      const cloneTarget = new target.constructor();
      map.set(target, cloneTarget);

      Reflect.ownKeys(target).forEach((key) => {
        cloneTarget[key] = deepClone(target[key], map);
      });
      return cloneTarget;
    }

测试代码:

    // 特殊类型
    // let target = null;
    // let target = new Date();
    // let target = new Set([10, 10, 12, 14, { name: "zzz" }]);
    // let target = new Map([
    //   [
    //     ["watermelon", "fruit"],
    //     ["cat", "animal"],
    //   ],
    // ]);
    // let target =
    //   /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[1-9]|2[1-9])$/;
    // let target = `<div class="searchbtn"><a href="#" @click="search">检索</a></div>`;

    // 原始类型
    // let target = 3;

    let target = {
      name: "张三",
      info: {
        age: 18,
      },
      fun: function () {
        console.log("111");
      },
    };
    target.target = target;
    console.log(deepClone(target));
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值