为什么更改数组变量项会影响它在Javascript中插入的数组?

时间:2014-10-01 16:03:33

标签: javascript arrays variables console

以下是一些代码:

var a = [1,2,3];
var b = [5,4];
var c = 6;
a.push(b);
console.log(a);
b[0] = 1;
console.log(a);
console.log(b);
a.push(c);
console.log(a);
c = 7;
console.log(a);

以下是控制台中的结果:

[ 1, 2, 3, [ 5, 4 ] ]
[ 1, 2, 3, [ 1, 4 ] ]
[ 1, 4 ]
[ 1, 2, 3, [ 1, 4 ], 6 ]
[ 1, 2, 3, [ 1, 4 ], 6 ]

有人能告诉我为什么在将数组推送到数组后更改b数组的第一项也会影响数组吗?例如,当我将c变量的值更改为数组时,它不会影响数组,这也是我想要用b发生的事情。

1 个答案:

答案 0 :(得分:4)

javascript中的对象(如数组)作为引用传递。所以,当你这样做时:

a.push(b)

您正在将对b的引用推送到数组a。如果您稍后更改b,则只有一个b,因此它会在引用它的所有位置发生更改,包括在数组中。

另一种说法是,a.push(b)不会复制b。推入数组的内容只指向你一直有的b,如果你改变b,数组中的引用只指向那个b那么看通过数组的值也会看到变化。


如果您真的想要一个推送到数组中的副本(不受原始更改影响),您可以使用.slice()制作一个明确的副本。

var a = [1,2,3];
var b = [5,4];
var c = 6;
a.push(b.slice());   // push a shallow copy of b

在学习javascript时,这是一个相当基本的东西。当您在javascript中传递或分配对象(并且数组是一种类型的对象)时,不会创建副本。相反,您最终会将代码的多个部分都指向完全相同的对象。这显然是一个可以利用的功能,但这意味着当您想要一个与原始版本无关的独立副本时,您必须明确地制作副本。

与此形成对比的是,布尔值或数字等基元被指定或传递为副本。

相关问题