我试图创建一个0初始化的2d数组。我有两个测试应该是相同的,但它们不是。对test1 [x]的任何修改都将导致所有test1 [x]条目匹配。为什么test1的所有子数组都相同?
注意:在codepen上运行它,所有子数组在第一个说[圆形对象Arrray]之后
指向codepen的链接:https://codepen.io/tannyr/pen/qXLmeG?editors=1111
var test1 = Array(2).fill(Array(2).fill(0))
var test2 = [[0,0],[0,0]]
test1[0][0] = 1 // <= Should edit a single value
test2[0][0] = 1
console.log(test1[0], test1[1]) // [1, 0] [1, 0] <= Should match test 2
console.log(test2[0], test2[1]) // [1, 0] [0, 0]
&#13;
答案 0 :(得分:2)
这是因为您要将同一数组的引用添加到test1中的两个元素。
var test1 = Array(2).fill(Array(2).fill(0))
基本上与
var arr = Array(2).fill(0);
var test1 = Array(2).fill(arr);
由于两个元素都引用了相同的数组,因此如果编辑其中一个更改也会反映在其他数组中。
而在...
var test2 = [[0,0],[0,0]]
您正在为test2的两个元素添加两个单独的数组,因此您可以单独编辑它们。
你也可以使用循环来填充数组元素,如下所示:
var test1 = [];
for(var i=0; i<2; i++)
test1.push([0,0]);
答案 1 :(得分:1)
这有点棘手,但是当你以这种方式使用填充时,它会生成一个数组,然后将其放入所有填充位置。你可以做你想做的事就是说Array(2).fill().map(() => [0, 0])
这将初始化阵列中的所有插槽,然后将您需要的值映射到新插槽中。
答案 2 :(得分:0)
Array(2).fill(0)
创建一个数组,而外语Array(2).fill
似乎两次添加确切创建的数组。这意味着test1数组中的两个项都引用同一个数组。因此,如果更改一个数组中某个元素的值,则考虑到两个数组都指向同一位置,它会更改两个数组中的元素。
记住它的工作顺序。您正在调用函数并传递值。它只会评估内部函数一次,得到它的返回类型并在外部函数中使用它。