所以我在JavaScript'复制'数组时遇到了这个奇怪的问题:
var a = [0];
var b = a;
b[0]++;
alert(a);
alert(b);
当我期待
1
和1
时,会将我作为提醒0
和1
。
如果我使用slice
复制数组,它可以正常工作:
var a = [0];
var b = a.slice(0);
b[0]++;
alert(a);
alert(b);
为什么会这样?
我找不到任何可以解释这个问题的方法。
答案 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
所做的是将数组中的每个项目复制到新实例。