在使用阵列填充初始化的阵列上使用阵列映射时出现意外行为

时间:2014-12-23 02:06:00

标签: javascript ecmascript-6

我在使用新Array.prototype.fill方法遇到问题,因为与Array.prototype.map一起使用时出现意外输出。例如:

// Initialize our n x n matrix and fill with 0's
let M = Array(3).fill(Array(3).fill(0));

M.map(function (row, i) {
    row[i] = i;
    return row;
}); //=> [[0, 1, 2], [0, 1, 2], [0, 1, 2]]

在上面的例子中,我希望输出与下面的例子相同:

let  M = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

M.map(function (row, i) {
    row[i] = i;
    return row;
}); //=> [[0, 0, 0], [0, 1, 0], [0, 0, 2]]

然而,它并非如此。由于某种原因,在第一个示例中返回的结果将被用作下一次迭代中的行值。有什么想法可能会发生吗?我使用6to5ify变换进行浏览器化,将ES6代码转换为ES5。

1 个答案:

答案 0 :(得分:1)

您的代码相当于:

let inner = Array(3).fill(0);
let M = Array(3).fill(inner);

当您将inner传递给.fill()时,它不会复制它,M数组包含对同一数组的3个引用。所以你对M的一个元素所做的任何事情都会发生在他们身上。

您需要为M的每个元素创建新数组:

let M = [];
for (var i = 0; i < 3; i++) {
    M.push(Array(3).fill(0));
}