我想知道为什么会这样?
Array#fill
将您提供的值作为第一个参数,并用该值的副本填充数组。
你给它的值是一个数组的引用,所以自然它给你的是一个充满该引用副本的数组。不是数组的副本,是引用的副本。
例如,出于与此代码完全相同的原因,它会以这种方式运行:
var a = new Array(10);
var b = a;
...让我们a
和b
两者都引用同一个数组(两者都包含相同的值;对我们创建的单个数组的引用)。
让我们对它进行一些 Unicode 艺术:
这段代码运行后:
var a = new Array(10);
var b = a;
我们在内存中有这个(减去一些不相关的细节):
a:Ref89895−−−+
|
| +−−−−−−−−−−−−−−−−−+
+−−−−−−>| 数组 |
| +−−−−−−−−−−−−−−−−−+
| | 长度:10 |
b:Ref89895−−−+ +−−−−−−−−−−−−−−−−+
a
并b
包含一个参考,我在此处显示为 Ref89895,尽管我们从未看到实际值。这就是 复制的内容b = a
,而不是数组本身。
同样,当您执行以下操作时:
var matrix = new Array(10).fill(new Array(10), 0);
你最终得到
+−−−−−−−−−−−−−−−−−+
矩阵:Ref89895−−−>| 数组 |
+−−−−−−−−−−−−−−−−−+
| 长度:10 |
| 0:Ref55462 |--\
| 1:Ref55462 |--\\
| 2: Ref55462 |--\\\
| 3: Ref55462 |--\\\\ +−−−−−−−−−−−−−−−+
| 4:Ref55462 |---++++++->| 数组 |
| 5: Ref55462 |--///// +−−−−−−−−−−−−−−−+
| 6:Ref55462 |--//// | 长度:10 |
| 7: Ref55462 |--/// +−−−−−−−−−−−−−−−+
| 8:Ref55462 |--//
| 9:Ref55462 |--/
+−−−−−−−−−−−−−−−−−+
要创建一个 10 位数组,其中 10 个位中的每一个本身都是 0 的 10 位数组,我可能会使用Array.from
或fill
with map
:
// Array.from
var matrix = Array.from({length: 10}, function() {
return new Array(10).fill(0);
});
// fill and map
var matrix = new Array(10).fill().map(function() {
return new Array(10).fill(0);
});
或在 ES2015 中:
// Array.from
let matrix = Array.from({length: 10}, () => new Array(10).fill(0));
// fill and map
let matrix = new Array(10).fill().map(() => new Array(10).fill(0));