当我创建new Array(9)
时,它似乎并没有真正创建新数组,因为当我尝试使用take
改变单个数组实例时,它会改变所有数组。显然,他们每个都引用相同的数组,而不是他们自己的new Array
,但为什么呢?我该如何解决这个问题?我曾在各个地方试过Array.prototype.slice()
,但都无济于事。
const Board = (fillWith = null) => ({
winner: null,
squares: new Array(9).fill(fillWith),
winningSquares: []
});
const game = new Board( new Board() );
const take = (iA, iB, token) => {
game.squares[iA].squares[iB] = token;
}
take(0,0,'x');
take(8,1,'o');
game.squares.map( (miniboard, i) => console.log({[i]: miniboard.squares}))
{ 0: [ 'x', null, null, null, null, null, null, null, null ] }
{ 1: [ null, null, null, null, null, null, null, null, null ] }
{ 2: [ null, null, null, null, null, null, null, null, null ] }
{ 3: [ null, null, null, null, null, null, null, null, null ] }
{ 4: [ null, null, null, null, null, null, null, null, null ] }
{ 5: [ null, null, null, null, null, null, null, null, null ] }
{ 6: [ null, null, null, null, null, null, null, null, null ] }
{ 7: [ null, null, null, null, null, null, null, null, null ] }
{ 8: [ null, 'o', null, null, null, null, null, null, null ] }
{ 0: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 1: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 2: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 3: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 4: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 5: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 6: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 7: [ 'x', 'o', null, null, null, null, null, null, null ] }
{ 8: [ 'x', 'o', null, null, null, null, null, null, null ] }
好的,这已被标记为重复,有些人抱怨它已被回答了数十万次。我知道了。感觉非常熟悉,我完全意识到对象和数组是通过引用复制的,这就是我尝试使用new
运算符创建新板的原因。我也尝试过引用的Array.from
解决方案,但这也没有帮助。也许还有其他事情发生在这里,早上会得到答案,但是现在我在这里参考了我尝试的更新代码(但没有用)只是为了表明我确实尝试过什么被建议作为我的"重复"的答案。题。
const Board = (fillWith = null) => ({
winner: null,
squares: Array.from({length: 9}, () => fillWith),
winningSquares: null
});
答案 0 :(得分:1)
fill
获取一个实例并用它填充所有行。所以你的所有行都引用同一个实例,因为array是一个引用类型,你只在每行引用。 <{1}}使用fill
为每行返回自己的数组。