我的所有阵列都是变异的,但为什么呢?

时间:2017-11-15 06:56:39

标签: javascript arrays

当我创建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
});

1 个答案:

答案 0 :(得分:1)

fill获取一个实例并用它填充所有行。所以你的所有行都引用同一个实例,因为array是一个引用类型,你只在每行引用。 <{1}}使用fill为每行返回自己的数组。