递归深拷贝

111 阅读1分钟

深拷贝使用 JSON.parse(JSON.stringify(obj)) 处理日期对象、undefined、null、function 等数据会出错。

普遍的办法是手写递归深拷贝

lodash有深拷贝函数,npm也有clone-deep包可以用

      let obj = {
        numberParams: 1,
        functionParams: () => {
          console.log("昨天基金全是绿的,只有我的眼睛是红的");
        },
        objParams: {
          a: 1,
          b: 2,
        },
      };

      let deepClone = (obj = {}) => {
        let newObj = Array.isArray(obj) ? [] : {};
        // 递归条件
        if (typeof obj === "object" && typeof obj !== null) {
          // 如果目标是引用类型,遍历复制目标的所有属性
          for (let key in obj) {
            newObj[key] = deepClone(obj[key]); // 递归核心
          }
        } else newObj = obj; // 如果目标不是引用类型,则直接赋值
        return newObj; // 递归出口
      };

      let obj2 = deepClone(obj);
      obj2.objParams.a = 123123123123;
      console.log(obj);
      console.log(obj2);