两者有什么区别?
// Chrome console
Array(2); // [undefined × 2]
Array(2).map(() => 1); // [undefined × 2]
[...Array(2)]; // [undefined, undefined]
[...Array(2)].map(() => 1); // [1, 1]
基于What are Array empty slots?,它似乎与内存分配有关,但为什么扩展运算符突然导致在后一种情况下分配内存?
答案 0 :(得分:6)
所有这些电话都是等效的:
Array(2)
new Array(2)
var a = []; a.length = 2
它们在某种意义上是相同的,它们为分配分配内存,但不创建索引。
Object.keys(Array(2)) // []
。
这就是你做什么的原因
Array(2).map(() => 1); // [undefined × 2]
map
在迭代数组时缺少迭代索引键。
...
运算符调用内置[Symbol.iterator]
迭代器的数组的values()
,并且即使缺少键索引也会迭代值。
这就是为什么在结果中我们有一个新的数组具有明确的未定义值和关键索引。
Object.keys([...Array(2)]) // ["0", "1"]
。
之后map
按预期工作,迭代键和相应的值。