javascript - Array.prototype.fill() 与 fill as I go 不同

标签 javascript arrays

<分区>

我正在研究一个将结果输出到二维数组的问题,并在每个元素中添加一个。

我尽可能地简化了代码以创建一个测试用例。如果我边走边填充数组,如下所示:

var a = [[], [], [] ,[] ,[], []];
var d1, d2;
for (d1 = 0; d1 < 6; d1++) {
    for (d2 = 0; d2 < 6; d2++) {
        a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; 
    }
}

我得到一个二维数组,其中所有值都是 1。但是,如果我使用 array.prototype.fill() 预填充数组,如下所示:

var a = new Array(6).fill(new Array(6).fill(0));
var d1, d2;
for (d1 = 0; d1 < 6; d1++) {
    for (d2 = 0; d2 < 6; d2++) {
        a[d1][d2] += 1; 
    }
}

我得到一个全是 6 的二维数组。即使我将 a[d1][d2] += 1 替换为旧的 a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1;,(应该仍然有效,因为 0 和 undefined 都是假的)我仍然得到 6s。

据我所知,我的代码应该只是循环遍历每个元素并将前一个值加一。它不应多次接触任何元素,因此它们都应为 1。我是否提前填充数组应该无关紧要。

我的理解哪里出了问题?

最佳答案

Array.fill旨在用于使用 static 值填充数组中从起始索引到结束索引的所有元素。

不幸的是,这意味着如果您传入一个元素(例如新数组),您的数组实际上将充满对同一元素的许多引用。换句话说,a 没有填充六个大小为 6 的数组; a 填充了六个指向大小为 6 的相同数组的指针。

您可以在您的开发者控制台中轻松验证这一点:

var a = new Array(6).fill(new Array(6).fill(0));
a
>>> [Array[6], Array[6], Array[6], Array[6], Array[6], Array[6]]
a[0]
>>> [0, 0, 0, 0, 0, 0]
a[1]
>>> [0, 0, 0, 0, 0, 0]
a[0][1] = 1
a[0]
>>> [0, 1, 0, 0, 0, 0]
a[1]
>>> [0, 1, 0, 0, 0, 0]

关于javascript - Array.prototype.fill() 与 fill as I go 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36706642/

相关文章:

javascript - 未捕获的类型错误 : undefined is not a function javascript function

javascript - 在来自不同 .JS 文件的函数中引用数组

javascript - 任何现有的 JavaScript 执行上下文可视化工具?

javascript - 对象内部的循环数组

c++ - jsoncpp 只写一个元素的json数组

c - C中的冒泡排序数组

arrays - PostgreSQL:更新 JSONB 结构内嵌套数组中元素的属性

javascript - 外来对象文本未出现

javascript - 谷歌分析事件跟踪 : tracking links within a drop-down form

javascript - 自定义管道返回错误。::TypeScript & Angular2