以下是一些代码:
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发生的事情。
答案 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中传递或分配对象(并且数组是一种类型的对象)时,不会创建副本。相反,您最终会将代码的多个部分都指向完全相同的对象。这显然是一个可以利用的功能,但这意味着当您想要一个与原始版本无关的独立副本时,您必须明确地制作副本。
与此形成对比的是,布尔值或数字等基元被指定或传递为副本。