我想知道为什么会这样?
Array#fill 将您提供的 value 作为第一个参数,并用该 value 的副本填充数组。
你给它的值是一个数组的引用,所以它给你的自然是一个填充了该引用副本的数组。不是 array 的副本,reference 的副本。
例如,它的行为方式与此代码完全相同:
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 和 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));