js 深克隆实现

2022-11-26  本文已影响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));
上一篇 下一篇

猜你喜欢

热点阅读