0%

725_深浅拷贝

<script>
      var o = {};
      var per = {
        name: "刘德华",
        age: 18,
        sex: {
          xingbie: "男",
        },
      };
      //浅拷贝:只拷贝复杂数据类型的地址,这个地址依旧指向堆里面的数据值
      Object.assign(o, per);
      //   for (var k in per) {
      //     o[k] = per[k];
      //   }
      console.log(per.sex.xingbie); //男
      o.sex.xingbie = "女";
      console.log(per.sex.xingbie); //女

      console.log("-----------------------------");
      //浅拷贝:每一层的数据都会被拷贝
      //   总之,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。
      var o1 = {};
      var per1 = {
        name: "刘德华",
        age: 18,
        sex: {
          xingbie: "男",
        },
      };
      //封装函数
      function deeoCopy(newObj, oldObj) {
        for (var key in oldObj) {
          //判断是不是数组
          if (oldObj[key] instanceof Array) {
            newObj[key] = [];
            deeoCopy(newObj[key], oldObj[key]);
          }
          //判断是不是对象
          if (oldObj[key] instanceof Object) {
            newObj[key] = {};
            deeoCopy(newObj[key], oldObj[key]);
          } else {
            //简单数据类型
            newObj[key] = oldObj[key];
          }
        }
      }
    </script>