深拷贝与浅拷贝的区别(简单理解)

深拷贝与浅拷贝的区别(简单理解)

如何区分深拷贝与浅拷贝?

简单点来说,就是假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝。如果B没变,那就是深拷贝。
简单图解如下:
在这里插入图片描述
在js的数据类型中,可以分为 基本类型引用数据类型 。有着类似于深拷贝和浅拷贝的特性。

1.基本类型–名值存储在栈内存中,例如let a=1;
在这里插入图片描述
当你b=a复制时,栈内存会新开辟一个内存,例如这样:
在这里插入图片描述
所以当你此时修改a=2,对b并不会造成影响。(深拷贝)

2.引用数据类型–名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,我们以上面浅拷贝的例子画个图:
在这里插入图片描述
当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。
在这里插入图片描述
所以在修改了b的值后,a也会跟着受影响。相当于在修改的是同一个数据。

那如果要对引用数据类型进行复制操作怎么办呢??
在这里插入图片描述
常用的深拷贝有递归,JSON对象的parse和stringify,JQ的extend方法

作为萌新,我使用的是相对简单的JSON对象的方法进行深拷贝。

因为
JSON.stringify() 对象转化为JSON字符串
JSON.parse() JSON字符串转化为对象

所以用

let b = JSON.parse(JSON.stringify(a));

就实现了b的深拷贝,修改b内的值,不会影响到a 。

有错欢迎指正~

参考的大佬文章链接: https://www.cnblogs.com/echolun/p/7889848.html.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值