一篇文章弄懂深浅拷贝

       其实这两个概念真的很简单,但是实际工作中,大多数人依然没有彻彻底底的搞明白他们之间的一些区别。介绍深浅拷贝之前,需要先说说赋值。其实在很多人眼里,包括之前的我也有这个误解,认为浅拷贝和赋值是一样的东西,实际不是的。区别还很大。

首先是一些前置知识:

       1、js的一般数据类型是存储在栈中;

       2、js的引用类型的数据是存储在堆中;

针对引用数据类型来说 赋值、深拷贝、浅拷贝的区别:

      - 赋值:当我们把一个新对赋值给一个新的变量时,赋的其实是改对象的在栈中的地址值,而不是堆中的数据,也就是两个对象指向同一个堆内存空间,无论哪个对象改变,其实都是改变的堆中的数据,因此两个对象其实是联动的。

      - 浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用数据类型因共享一块内存,会互相影响。进一步说明:浅拷贝是创建一个对象,这个对象有着原始对象属性的一份精确拷贝,如果属性是基本数据类型,拷贝的就是基本类型的值;如果属性是引用数据类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

      - 深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后两个对象互不影响。进一步说明:两个对象完全不相干,各干各的。

浅拷贝的实现方式

      -Object.ssign()

      -lodash 的 clone()

      -...展开运算符

      -Array.prototype.contact

      -Array.prototype.slice

深拷贝的实现方式

      -JSON.parse(JSON.stringfy())

      -递归的操作

      -lodash cloneDeep()

      -Jquery.extend()

 

实际代码:

注意点 JSON.parse(JSON.stringfy()) 是没法复制function、date、RegExp、null

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三木森森の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值