深.浅拷贝

83 阅读1分钟

链接

浅拷贝

1.浅拷贝只是拷贝了栈中的内存地址,创建了一个新的对象。如果是属性是基本数据类型,那么拷贝的是属性的值:原对象改变,新对象不会跟着改变;如果拷贝的是内存地址(引用数据类型),那么会跟着改变

      let a = ["a", "b", "c"];
      let b = a;    
      b[0] = "1";    // 改变b数组的第一项为1,那么a数组的第一项也会跟着改变
      console.log("a", a);    // ['1', 'b', 'c']
      console.log("b", b);    // ['1', 'b', 'c']

深拷贝

复制原来的但不修改原来的对象,就用深拷贝,(深拷贝就是增加一个指针,并申请一个新的内存,并且让这个新增加的指针指向这个新的内存地址使用深拷贝,在释放内存的时候就不会像浅拷贝一样出现释放同一段内存的错误)

this.filterList = JSON.parse(JSON.stringify(this.filList));
 // 先将数组转为字符串,再转为对象,就会形成一个新的对象。改变他,原来的就不会跟着改变

递归 适用于复杂数据类型

getnum() {
      const obj1 = {
        a: 1,
        b: "xxxx",
        like: {
          city: "beijing",
        },
        list: ["a", "b", "c"],
      };
      let obj2 = this.clone(obj1);
      obj2.like.city = "shenzhen";
      obj2.a = 3;
      console.log("obj1", obj1);
      console.log("obj2", obj2);
    },
    clone(obj) {
    // 先检测传入的obj是否为对象,或者空
      if (typeof obj !== "object" || typeof obj == null) {
      // 不是的话,直接return 基本数据类型
        return obj;
      }
      let resnum;
      // 定义类型  instanceof 判断数值类型 是否为数组
      if (obj instanceof Array) {
        resnum = [];
      } else {
        resnum = {};
      }
      for (let key in obj) {
      // obj中是否真的存在key值
        if (obj.hasOwnProperty(key)) {
        // 使用递归 继续调用
          resnum[key] = this.clone(obj[key]);
        }
      }
      // return出去
      return resnum;
    },