假设您有以下代码:
var array = [1];
var array2 = array;
array2.push(2);
alert(array);
即使我清楚地将array
声明为[1]
,这也会提醒“1,2”,然后不对其进行任何更改。就像array
和array2
已建立关联,我对array2
所做的每项更改都会影响array
。我只想声明array2
的值与array
相同,而不是连接它们。
为什么会发生这种情况以及如何预防?
提前致谢!
答案 0 :(得分:1)
问题是,array2指向数组。
你想要的是:
var array2 = array.slice(0);
这确实创建了一个"数组"的副本。并且不要让变量array2指向" array"。
答案 1 :(得分:1)
这是因为JS中的数组和对象是“通过引用传递”(实际上是引用的副本),而不是值(与基元一样)。有很多方法可以做到这一点,其中一种方法是连接一个空数组:
var array = [1];
var array2 = array.concat([]);
array2.push(2);
alert(array); // 1
alert(array2); // 1,2
在这里看到一些不错的答案:Does Javascript pass by reference?
答案 2 :(得分:1)
对于所有人来说,在Javascript中数组是对象
所以数组变量指向一个in数组(你创建[1]
),它在内存中有一个adresse(例如@ 1234abc)。所以它自身的变量数组是一个指向数组的指针。
你做了var array2 = array
所以array2将指向内存中的相同地址(到同一个对象)。
换句话说, array2是数组,它们指向同一个对象。
要获得所需内容,您必须创建一个新数组并分配相同的array1值,这称为克隆。
你可以用这个技巧var array2 = array.slice(0);
答案 3 :(得分:0)
array2
是对原始数组的引用,因此如果您修改它,原始数据也会更改。
您必须将array2
的值设置为array.slice(),它会克隆原始值并为您提供新的引用。
答案 4 :(得分:0)
这是因为概念Pass by reference。在内部,两个变量都指向相同的内存位置。因此,当您更改一个会影响其他变量的变量时。如果您打算仅复制值而不复制引用,请尝试使用slice()
方法。 :)