我正在研究一个将其结果输出到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;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个装满6s的2D阵列.即使我a[d1][d2] += 1用旧的替换a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1;,(因为0和undefined都是假的,它仍然可以工作)我仍然得到6s.
据我所知,我的代码应该循环遍历每个元素并将一个元素添加到前一个值.它不应该多次触摸任何元素,所以它们都应该是1.我是否提前填满阵列应该不重要.
我的理解失败在哪里?
Array.fill用于从开始索引到具有静态值的结束索引填充数组的所有元素.
遗憾的是,如果传入一个新数组之类的元素,您的数组实际上将填充许多对该元素的引用.换句话说,a没有填充六个大小为六的数组; a有六个指针到六个相同的数组.
您可以在开发人员控制台中轻松验证:
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]
Run Code Online (Sandbox Code Playgroud)