常见的性能优化与问题总结(一)浅拷贝和深拷贝

浅拷贝和深拷贝

为什么要使用深拷贝?

我们希望在改变新的数组(对象)的时候,不改变原数组(对象)

  1. 浅拷贝
    浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存(分支)。
    浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
    如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

  2. 深拷贝
    深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”(不是分支)
    拷贝第一层级的对象属性或数组元素
    递归拷贝所有层级的对象属性和数组元素
    深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

深拷贝和浅拷贝的区别

当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

把两个对象指向同一个地址,修改其中的一个,另一个也会发生改变
如果是一层数组或对象,那就是深拷贝。 如果value是引用类型,这时会进行深拷贝,但是引用地址还是不变,违背了深拷贝概念。 所以还叫浅拷贝。
如果是一层数组或对象,那就是深拷贝。 如果value是引用类型,这时会进行深拷贝,但是引用地址还是不变,违背了深拷贝概念。 所以还叫浅拷贝。

最常见的
如果数据结构当中存在对象里面套数组,数组里面有套对象,通产需要使用深拷贝解决这类问题
如果把一个对象的值直接通过 = 赋值给另一个对象,那么通常浅拷贝就可以

   // 浅拷贝和深拷贝的问题
      //=把两个对象指向同一个地址,修改其中的一个,另一个也会发生改变
      // 解决方法通过...ES6运算符扩展,实现Q浅拷贝
      // 如果是一层数组或对象,那就是深拷贝。 如果value是引用类型,这时会进行深拷贝,但是引用地址还是不变,
      // 违背了深拷贝概念。 所以还叫浅拷贝。
      // 如果是一层数组或对象,那就是深拷贝。 如果value是引用类型,这时会进行深拷贝,但是引用地址还是不变,违背了深拷贝概念。 所以还叫浅拷贝。
        // 视频写法
        // this.tmForm = { ...row };
        console.log(row);
       this.tmForm.id=row.id
        this.tmForm.tmName=row.tmName
        this.tmForm.logoUrl=row.logoUrl

    },
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值