浅拷贝和带有JavaScript数组的深拷贝有什么区别?

What is the difference between a shallow copy and a deep copy with JavaScript arrays?

本问题已经有最佳答案,请猛点这里访问。

根据MDN文档,调用array.slice()将创建数组的浅副本。

请参阅slice()的MDN链接。

但是,如果我在控制台中运行类似的简单测试:

1
2
var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();

并且检查浅拷贝,我可以看到整个二维数组似乎被复制了。

浅拷贝和深拷贝有什么区别?如果我猜的话,我会称之为一个深刻的副本。


要查看区别,请尝试:

1
2
shallow_copy[0][2] = 4;
console.dir(test);

您将看到test已被修改!这是因为尽管您可能已经将值复制到新数组,但嵌套数组仍然是相同的。

深拷贝将递归地执行浅拷贝,直到所有内容都是原始文件的新拷贝。


基本上,您只需要获得对原始变量/数组的引用。更改引用也将更改原始数组。您需要循环原始数组的值并形成一个副本。

考虑这个例子:

1
var orig = {  a: 'A', b: 'B', c: 'C' };

假设您希望创建此的副本,这样即使更改原始值,也可以始终返回原始值。

我能做到这一点:

1
var dup = orig; //Shallow copy!

如果我们改变一个值:

1
dup.a = 'Apple';

由于我们有一份浅显的副本,或参考了var orig,因此本声明还将改变aorig。这意味着,原始数据也会丢失。

但是,通过使用原始orig变量的属性创建一个全新的变量,您可以创建一个深度副本。

1
var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!

现在,如果您更改dup.a,它只会影响dup,而不会影响orig