手写一个深复制

var obj = {
        a: 1,
        b: "aaa",
        c: false,
        d: {
          e: [3, 4, 6, 8, 9],
          f: null,
          g: [
            { id: 1, name: "abc", price: 100, tag: ["自营", "特价"] },
            { id: 2, name: "def", price: 200, tag: ["自营"] },
            { id: 3, name: "ghi", price: 300, tag: ["自营", "特价", "双十一"] },
            { id: 4, name: "gkl", price: 400, tag: ["专柜", "双十一"] },
          ],
          h: {
            i: /^(?=\D+\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/i,
            j: new Date(),
            k: {},
          },
        },
      };
      Object.defineProperties(obj.d.h.k, {
        l: {
          value: [
            [1, 2, 3, 4],
            [1, 4, 3, 4],
            [1, 6, 3, 4],
          ],
        },
        m: {
          enumerable: true,
          value: document.createElement("div"),
        },
        n: {
          writable: true,
          value: {
            o: [1, 2, 3],
          },
        },
      });
      
      function cloneObj(source, target) {
        if (!target) target = new source.constructor();
        let name = Object.getOwnPropertyNames(source);
        for (let i = 0; i < name.length; i++) {
          let desc = Object.getOwnPropertyDescriptor(source, name[i]);
          if (typeof desc.value !== "object" || desc.value === null) {
            Object.defineProperty(target, name[i], desc);
          } else {
            let t = {};
            switch (desc.value.constructor) {
              case Array:
                t = [];
                break;

              case RegExp:
                t = new RegExp(desc.value.source, desc.value.flags);
                break;

              case Date:
                t = new Date(desc.value);
                break;

              default:
                if (desc.value instanceof HTMLElement) {
                  t = document.createElement(desc.value.nodeName);
                }
                break;
            }

            Object.defineProperty(target, name[i], {
              ...desc,
              value: t,
            });
            cloneObj(desc.value, t);
          }
        }
        return target;
      }

      const o = cloneObj(obj);
      console.log("o", o);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值