手写深拷贝deepClone

2024-02-28  本文已影响0人  靴唯白

解题思路

      let carProp = {
        name: "summer",
        carObj: {
          color: "red",
          size: "large",
        },
        cars: ["小卡车", "大卡车"],
      };
      function deepClone(obj) {
        // 首先判断传进来的 obj类型 是否是object,不是直接原样返回 obj
        if (typeof obj !== "object") return obj
        // 声明一个拷贝对象并且根据是否是数组赋值
        let cyObj = Array.isArray(obj) ? [] : {};
        // 遍历旧对象 obj
        for (let key in obj) {
          // 判断旧对象obj[key]是否是object, 如果是 则进行递归拷贝同时赋值给 拷贝对象 cyObj[key],反之直接赋值
          if (typeof obj[key] === "object") {
            cyObj[key] = deepClone(obj[key]);
          } else {
            cyObj[key] = obj[key];
          }
        }
        // 最后递归完毕以后直接返回 拷贝对象 cyObj
        return cyObj;
      }

      let car1 = deepClone(carProp);
      let car2 = deepClone(carProp);
      let car3 = deepClone(function(ar) {return ar});
      let car4 = deepClone(111);
      car1.carObj['name'] = '打卡'
      car1.name = '小薛'
      car2.cars.shift()
      console.log(car1);   // {name: '小薛', carObj: {…}, cars: Array(2)}
      console.log(car2);   // {name: 'summer', carObj: {…}, cars: Array(1)}
      console.log(car3);   // ƒ (ar) {return ar}
      console.log(car4);   // 111
上一篇 下一篇

猜你喜欢

热点阅读