包含数组,对象和字符串的一个对象object进行深克隆

55 阅读1分钟

代码和注释逻辑如下

<script>
  //
  var obj1 = {
    a: 1,
    b: 2,
    c: [
      33,
      44,
      {
        m: 55,
        n: 66,
        p: [77, 88],
      },
    ],
  };

  var obj2 = deepClone(obj1);
  //原来对象里面有数组,对象, 因为最后输出的时候,数组就按数组的方式输出,对象就按照对象的方式输出,
  // 所以定义函数的时候,要有两个参数,要克隆的对象,第二个先默认一个对象类型
  // 后面每一次用到递归函数,都要写两个参数
  function deepClone(obj1, type = "object") {
    // 首先obj2默认为空对象和空数组,用来接收obj里面的对象和数组
    if (type == "object") {
      var obj2 = {};
    }
    if (type == "array") {
      var obj2 = [];
    }
    // 遍历obj1中的所有元素
    for (var k in obj1) {
      // obj1中有数组,有对象,有字符串,
      // 继续判断是不是数组 ,是的话,继续执行递归函数,再传给obj2
      if (Array.isArray(obj1)) {
        obj2[k] = deepClone(obj1[k], "array");
      } else if (typeof obj1[k] === "object") {
        // 判断完是不是数组,接着判断是不是对象
        // 是对象的话,继续执行递归函数
        obj2[k] = deepClone(obj1[k]);
      } else {
        // 如果遍历出来的,不是对象,也不是数组,那么直接用obj2接收
        obj2[k] = obj1[k];
      }
    }
    // for循环结束,return出去
    return obj2;
  }

  console.log(obj2);

  //   typeof
  // 用于判断数据类型,返回值有number、string、boolean、function、undefined、object 六个。
  // 总结
  // 总之,typeof 和 instanceof 都是用来判断变量类型的,区别在于:
  // 1、typeof判断所有变量的类型,返回值有number、string、boolean、function、object、undefined。
  // 2、typeof对于丰富的对象实例,只能返回object,导致有时候得不到真实的数据类型。
  // 3、instanceof用来判断对象,代码形式(obj1 instanceof obj2)(判断obj1是否为obj2的实例),obj2必须为对象,否则会报错。返回的是布尔值。
  // 4、instanceof可以对不同的实例对象进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在于obj1的原型链上,(obj1 instanceof obj2)值为true。
</script>