js浅拷贝和深拷贝
Willem Zhang Lv5

拷贝

对基本类型的拷贝不存在深浅问题,都是深拷贝,因为基本类型是值,而不是地址。
对引用类型的拷贝讨论深浅问题。

浅拷贝

1
2
a = [1,2]
b = a

此时是浅拷贝,因为b得到的是一个地址,a和b指向同一个array。对array的操作会同时影响a和b

1
2
a = [1,2]
b = [...a]

此时是深拷贝,因为通过扩展运算符和字面量声明数组的方式,b得到了一个新的array的指针,a和b的地址不同,指向的是两个array。a指向array的改变并不会导致b指向array的改变。

1
2
a = [1,2,[3]]
b = [...a]

此时又变成了浅拷贝,因为a[2]不是基本类型,而是一个引用类型,是一个地址,b拷贝a实际上拷贝了两个值和一个地址。此时a[2]和b[2]的值都是同一个地址,当这个地址指向的值改变了,a[2]和b[2]都会改变。虽然改变a[0],a[1]的值不会引起b[0],b[1]的改变,但是存在相关联的量使得a和b不能完全独立,所以此时不是深拷贝。

所以,当改变a的任何一个值都不能引起b的变化时,即两者完全独立时,实现深拷贝。
而实现深拷贝的条件为当拷贝过程中出现地址时,a和b不能有相同的地址,一旦存在相同的地址,即使只是一个,也会导致这个拷贝不是深拷贝。

要实现深拷贝,就要在拷贝时不直接复制引用类型的地址,而是要根据引用类型生成一个新的引用类型,然后存入这个新引用类型的地址(这个地址与原引用类型的地址不同)。

  • Post title:js浅拷贝和深拷贝
  • Post author:Willem Zhang
  • Create time:2021-11-20 17:51:19
  • Post link:https://ataraxia.top/2021/11/20/js浅拷贝和深拷贝/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments