2D数组在JavaScript中产生意外结果

时间:2019-07-06 16:22:25

标签: javascript arrays

如果我使用JavaScript创建2D数组并尝试分配一个特定的对象,它将全部更改。这是我的代码:

var a = [0,1];
var b = [];
b.push(a);
b.push(a);
b[0][0]=5;
alert(b[1][0]);

现在我希望得到0,但我得到5。我该如何解决?

3 个答案:

答案 0 :(得分:1)

您推送相同的对象引用。通过跟踪一个值,所有引用都会显示更改后的值。相反,您可以使用Array#slice来刷新数组的副本。

var a = [0, 1];
var b = [];

b.push(a.slice());
b.push(a.slice());

b[0][0] = 5;

console.log(b[1][0]);
console.log(b);

答案 1 :(得分:0)

您要推送的数组是引用,因此两个索引处的值都引用a(引用a),这就是为什么任何索引处的更改都将反映所有指向同一引用的其他索引,需要增加价值,您可以看到我正在使用spread syntax创建数组副本

b.push([...a]);

var a = [0,1];
var b = [];
b.push(a);
b.push([...a]);
b[0][0]=5;
console.log(b);

答案 2 :(得分:0)

通过调用b.push(a)两次,您将为a的第一和第二索引分配相同的数组b。因此,如果您编辑a的元素,那么它将反映在同一实例的所有引用中。

您可以执行a的深层复制来防止这种情况。

例如,

b.push(a.slice());
b.push(a.slice());