Array.fill一个2x2数组,然后尝试设置arr [0] [0] = true填充整个列?

时间:2017-10-04 05:44:33

标签: javascript

我正在做一些DFS的东西,并希望使用与原始矩阵大小相同的数组来切换节点是否被访问过。我注意到当我尝试将节点设置为已访问visited[r][c] = true时,它最终设置了整个列。我意识到这只发生在Array(numberOfRows).fill(Array(numberOfCols).fill(false))

想知道为什么会这样做,以及是否有更好的方法来初始化具有一定数量的行/列的2D数组?

var foo = [
  [false,false],
  [false,false],
];
foo[0][0] = true;

var bar = Array(2).fill(Array(2).fill(false));
bar[0][0] = true;

console.log(foo);  // [[ true,false],[false,false]] (what I expected)
console.log(bar);  // [[ true,false],[true,false]]  (wtf?)

1 个答案:

答案 0 :(得分:2)

在第一种情况下,您创建了两个具有[]语法的独立数组,这些数组是对单独对象的单独引用。但案件是另一个Array#fill

Array#fill使用单个值。将数组传递到fill函数以填充外部数组时,只创建单个数组,并且它将填充外部数组中的所有项。这意味着单个数组的两个引用将插入外部数组中。

我们可以看到它比较了第一个和第二个数组的引用

var bar = Array(2).fill(Array(2).fill(false));

console.log(bar[0] === bar[1]);