如何阻止变量连接

时间:2015-04-19 10:02:11

标签: javascript arrays

假设您有以下代码:

var array = [1];
var array2 = array;

array2.push(2);

alert(array);

即使我清楚地将array声明为[1],这也会提醒“1,2”,然后不对其进行任何更改。就像arrayarray2已建立关联,我对array2所做的每项更改都会影响array。我只想声明array2的值与array相同,而不是连接它们。

为什么会发生这种情况以及如何预防?

提前致谢!

jsFiddle

5 个答案:

答案 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()方法。 :)