深拷贝和浅拷贝

数据的存储问题?

1:简单数据类型存储:把值存储在栈里面
2:复杂数据类型的存储,分为两步,就是地址存储在栈里面,而复杂数据类型的值(也就是对象)存储在堆里面。
注意点:在拷贝,new关键字,会在堆中生成一个空对象,对象的诞生,也就代表着地址也会生成
将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

一、浅拷贝

只是拷贝了一层,更深层次的对象级别(复杂数据类型)的只拷贝了引用(也就是地址)
注意点:就是在obj里面有着对象的时候,就是有着地址和值,仅仅只能把地址被拷贝过去,
于是造成被拷贝的对象和拷贝对象,都指向同一个地址,不管修改那个对象的地址,都会互相影响。
第一种浅拷贝方法 利用for in的方法

    let obj = {
      id: 1,
      name: "pink",
      msg: {
        age: 18
      }
    }
    let o = {}
    for (let k in obj) {
      // k为属性名 obj[k]为属性名  直接把属性值拷贝给另一个对象
      o[k] = obj[k];
    }
    console.log(o); //{id: 1, name: "pink", msg: {…}} age=18
    obj.msg.age = 30;
    console.log(o);
    console.log(obj);

第二种方法 利用es6的方法 Object.assign(target,…sources)
参数一位需要拷贝的对象,参数二:被拷贝的对象

    let obj = {
      id: 1,
      name: "pink",
      msg: {
        age: 18
      }
    }
    let o = {}
    //浅拷贝的第二种方法  es6方法 Object.assign(target,...sources) 参数一位需要拷贝的对象,参数二:被拷贝的对象
    Object.assign(o, obj);
    console.log(o); //age 为18
    obj.msg.age = 30; //若是修改了年龄后,不管是下面的o,还是obj对象,还是上面的o对象都被修改了。
    console.log(o);
    console.log(obj);

二、深拷贝

深拷贝是拷贝多层,每一层级别的数据都会被拷贝(不仅地址,还有值)
深拷贝: 就是对象里面的复杂数据类型,整个对象复制一次后,在开辟一个新的空间,两个存储空间互不影响
实现—先遍历外层的数据(对象),然后在遍历内存的数据(对象) —可以使用递归的方式

 let obj = {
      id: 1,
      name: "lala",
      msg: {
        age: 20
      },
      color: ["red", "pink", "yellow"]
    }
    let o = {}
    //封装一个函数,这边需要遍历两次对象,
    function deepCopy(newobj, oldobj) {
      for (let k in oldobj) {
        //先判断第一层的属性值属于那种数据类型 先判断是否为数组,然后判断是否为对象,最后判断是否属于简单数据类型
        let item = oldobj[k]; //属性值
        if (item instanceof Array) { //先判断是否为数组(因为数组也是属于对象,所以先判断)
          newobj[k] = []; //先创建一个空数组,用于存放数据
          deepCopy(newobj[k], item); //把item拷贝到newobj[k]
        } else if (item instanceof Object) {
          newobj[k] = {};
          deepCopy(newobj[k], item);
        } else {
          newobj[k] = item;
        }
      }
    }
    deepCopy(o, obj)
    console.log(o); //age为20
    obj.msg.age = 30;
    console.log(obj); //agewei30
    //注意:深拷贝,修改o或者obj都不会互相影响
方式3 推荐
function deepCopy(obj) {
  // 判断传递进来的是 数组还是对象
  let newObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj[key] && typeof obj[key] === "object") {
      newObj[key] = deepCopy(obj[key]);
    } else {
      // 没有子元素 简单数据类型
      newObj[key] = obj[key];
    }
  }
  // console.log("newObj", newObj);
  return newObj;
}
let obj = {
  id: 1,
  name: "lala",
  msg: {
    age: 20,
  },
  color: ["red", "pink", "yellow"],
};
let resObj = deepCopy(obj);
resObj.id = 2
resObj.msg.age = 30
resObj.color[1] = 'pink222'
console.log('obj',obj);
console.log("resObj", resObj);
  • 效果
    在这里插入图片描述
方式2:
this.flistVal = JSON.parse(JSON.stringify(this.GuaranteeKaiLiFList));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值