美文网首页
js 深克隆实现

js 深克隆实现

作者: 前端人 | 来源:发表于2022-11-26 18:02 被阅读0次
//整体想法 对基础类型 函数类型 引用类型分情况处理,用weakMap处理循环引用的情况
      const deepClone = (obj, distObj = {}, weakMap = new WeakMap()) => {
        if (!obj || typeof obj !== "object") {
          return distObj;
        }
        if (!weakMap.has(obj)) {
          weakMap.set(obj, distObj);
        }

        Object.keys(obj).forEach((key) => {
          const keyValue = obj[key];
          //函数的情况
          if (typeof keyValue === "function") {
            distObj[key] = keyValue;
            //对象情况
          } else if (keyValue && typeof keyValue === "object") {
            //说明还没有发生循环引用
            if (!weakMap.has(keyValue)) {
              //复制引用对象
              const dt = { ...keyValue };
              distObj[key] = dt;
              //把值存入weakMap
              weakMap.set(keyValue, dt);
              deepClone(dt, dt, weakMap);
            } else {
              //说明发生了循环引用
              distObj[key] = weakMap.get(keyValue);
            }
          } else {
            //基础类型情况
            distObj[key] = keyValue;
          }
        });

        return distObj;
      };

      //测试用例 构造循环引用
      const ddd = { aa: 44, c: 3, fun: () => 0 };
      const ttt = { d: 4, g: { d: ddd } };
      ddd.t = ttt;

      console.log("克隆结果", deepClone(ttt));

相关文章

网友评论

      本文标题:js 深克隆实现

      本文链接:https://www.haomeiwen.com/subject/zsmcfdtx.html