手写一个深拷贝函数,考虑Map,Set,循环引用

初级版本:

function deepClone_v1(obj) {

        if (typeof obj !== "object" || obj == null) {

          return obj;

        }

        let result;

        if (Array.isArray(obj)) {

          result = [];

        } else {

          result = {};

        }

        for (let key in obj) {

          if (obj.hasOwnProperty(key)) {

            result[key] = deepClone(obj[key]);

          }

        }

        return result;

      }

高级版本:

<script>

      function deepClone_v2(obj, map = new WeakMap()) {

        if (typeof obj !== "object" || obj == null) {

          return obj;

        }

        let objRef = map.get(obj);

        if (objRef) {

          return objRef;

        }

        let target = {};

        map.set(obj, target);

        // Map

        if (obj instanceof Map) {

          target = new Map();

          obj.forEach((v, k) => {

            let v1 = deepClone_v2(v, map);

            let k1 = deepClone_v2(k, map);

            target.set(k1, v1);

          });

        }

        // Set

        if (obj instanceof Set) {

          target = new Set();

          obj.forEach((v) => {

            let v1 = deepClone_v2(v, map);

            target.add(v1);

          });

        }

        // Array

        if (obj instanceof Array) {

          target = obj.map((item) => deepClone_v2(item, map));

        }

        // Object

        for (let k in obj) {

          let v1 = deepClone_v2(obj[k], map);

          target[k] = v1;

        }

        return target;

      }

      // 下面是测试代码

      let obj = {

        map: new Map([

          ["name", "foo"],

          ["age", 20],

        ]),

        set: new Set(["basketball", "football"]),

        address: {

          city: "bj",

        },

        sayHello: () => {

          console.log("Hello World!");

        },

      };

      obj.self = obj;

      console.log(deepClone_v2(obj));

    </script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值