let arr = [[1,2,3], [4,5,6], [7,8,9]]
arr[0][1] = 'X'
arr[1][1] = 'O'
console.log(arr);

我正在尝试制作一个初步的tic-tac-toe游戏,这种创建桌子的方法对我很好。
在阅读其他方法以生成矩阵阵列表时,我发现了这个
let newArr = new Array(3).fill(new Array(3))
newArr[0][1] = 'X'
console.log(newArr)

当我尝试返回newArr时,它实际上用' X'替换了整个列。
为什么这样做?我想也许在堆栈中它识别出我正在命名一个未定义索引的值,并且更倾向于对整个列执行相同操作但我无法确认。
答案 0 :(得分:1)
Array#fill
获取一个对象/原语并使用它来填充所有项目。你已经在函数中给出了一个数组,array是一个引用类型,所以它对所有项使用相同的引用,但是对象是单个的。那么为什么要更新所有列。
您可以比较参考,以确保创建单个并用于所有项目。
let newArr = new Array(2).fill(new Array(2));
console.log(newArr[0] === newArr[1]);

要创建您想要的数组,您可以执行
let newArr = Array.from({ length: 3 }, () => new Array(3));
newArr[0][1] = 'X';
console.log(newArr);