深拷贝与浅拷贝的区别(简单理解)
如何区分深拷贝与浅拷贝?
简单点来说,就是假设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.