我正在研究将其结果输出到2D数组中的问题,并在每个元素中添加一个。
我简化了代码,尽可能地创建测试用例。如果我按照我的方式填充数组,如下所示:
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;
}
}
我得到一个2D数组,其中所有值都是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;
}
}
我得到一个满是6s的2D数组。即使我用旧的a[d1][d2] += 1
替换a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1;
(因为0和undefined都是假的,它仍然可以工作)我仍然得到6s。
据我所知,我的代码应该循环遍历每个元素并将一个元素添加到前一个值。它不应该多次触摸任何元素,所以它们都应该是1。我是否提前填满阵列应该不重要。
我的理解失败在哪里?
答案 0 :(得分:5)
Array.fill
旨在用于使用 static 值从开始索引到结束索引填充数组的所有元素。
遗憾的是,如果传入一个新数组这样的元素,那么您的数组实际上将填充许多对该元素的引用。换句话说,a
没有填充六个大小为六的数组; 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]