Array.prototype.fill()对对象很奇怪

时间:2018-10-08 09:24:15

标签: javascript arrays

我要写一个小游戏,它需要一个二维数组来存储数据,

    for (let i = 0; i < rowNum; i++) {
        snakeRow.push(new Array(rowNum).fill({ isWall: false, isSnake: false, orient: 0 }));
        for (let j = 0; j < rowNum; j++) {
            let temprow = document.createElement("li");
            temprow.setAttribute("x", j);
            temprow.setAttribute("y", i);
            if (i === 0 || i === rowNum - 1 || j === 0 || j === rowNum - 1) {
                temprow.style.backgroundColor = 'black';
                snakeRow[i][j].isWall = true;
            }
            playground.appendChild(temprow);
        }
    }

当我console.log(snakeRow)时,我发现所有isWall都是真实的。 似乎它用我的对象的相同引用填充了数组,并且mdn证实了我的猜测。

// Objects by reference.
var arr = Array(3).fill({}) // [{}, {}, {}];
arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]

但是为什么fill()这样工作。我不认为充满相同事物的数组像数组一样工作,而只能是单例实例。

还有什么比使用for循环将对象推送到我的数组更好的了吗?谢谢。

0 个答案:

没有答案