无法在JavaScript中复制数组

时间:2016-05-04 14:17:29

标签: javascript arrays

所以我在JavaScript'复制'数组时遇到了这个奇怪的问题:

var a = [0];
var b = a;
b[0]++;
alert(a);
alert(b);

当我期待11时,

会将我作为提醒01

如果我使用slice复制数组,它可以正常工作:

var a = [0];
var b = a.slice(0);
b[0]++;
alert(a);
alert(b);

为什么会这样?

我找不到任何可以解释这个问题的方法。

3 个答案:

答案 0 :(得分:2)

变量中保存的数组是引用到内存中的数组。与简单值(例如数字或字符串)不同,arr2 = arr1之类的语句只是复制内存中版本的引用,而不是数组的“值”。

slice()实际上是从调用它的数组的部分(或者在本例中全部)创建一个新数组,这就是为什么你的第二个例子工作方式不同。

通常,如果您想要一个新的数组副本来执行某些操作,您应该先调用slice()进行复制。

答案 1 :(得分:0)

当你告诉一个变量被分配给另一个变量时,你正在做一个名为pass by reference的东西,它们都在访问内存中的同一个对象。在这种情况下,更改一个变量会影响另一个变量,因为它们都访问同一个对象。

当您切片并指定它时,您将通过值传递,这意味着它将存储它的值。在这种情况下,更改一个将被隔离,因为它们在内存中存储单独的对象。

请阅读此处了解更多信息:What's the difference between passing by reference vs. passing by value?

答案 2 :(得分:0)

当您将a分配给b时,您并没有真正复制数组,因为当您在a上更改某些内容时,您实际上正在更改b它位于源a上,slice所做的是将数组中的每个项目复制到新实例。