我正在做一些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?)
答案 0 :(得分:2)
在第一种情况下,您创建了两个具有[]
语法的独立数组,这些数组是对单独对象的单独引用。但案件是另一个Array#fill。
Array#fill使用单个值。将数组传递到fill
函数以填充外部数组时,只创建单个数组,并且它将填充外部数组中的所有项。这意味着单个数组的两个引用将插入外部数组中。
我们可以看到它比较了第一个和第二个数组的引用。
var bar = Array(2).fill(Array(2).fill(false));
console.log(bar[0] === bar[1]);