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