深浅拷贝

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

普通类型:string/number/boolen/underfine/null 存放在栈内存中,可以分配内存空间,属性和值都存在栈中,  如果实行拷贝就是深拷贝

引用类型:arry/object/function  存放在堆内存中,属性名存在栈中,值存在堆中。是浅拷贝,所以要对这3种类型拷贝的时候,需要用深拷贝,才不会出错。

深拷贝是要拷贝所有层级下的属性值,slice()和contact()可以实现一级属性的拷贝,

可以看出,slice()这个方法拷贝的并不彻底,一级属性可以完全拷贝过来,不受a改变的影响,但是二级属性还是没能拷贝成功,仍然脱离不了a的控制,说明slice根本不是真正的深拷贝。同理,concat方法与slice也存在这样的情况,他们都不是真正的深拷贝,这里需要注意。说一下,JSON.stringify与JSON.parse可以实现深拷贝。
 

浅拷贝其实拷贝的是它的引用地址,let a = [0,1,2,3,4,5]; b = a;
b拷贝了a在栈中的堆地址,都指向a在堆中的属性值,当a数组放生改变时,b属性值也会改变,因为b也指向相同的堆内存。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值