“Array(n)”和“[... Array(n)]”之间有什么区别?

时间:2017-05-29 17:41:29

标签: javascript arrays

两者有什么区别?

// 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?,它似乎与内存分配有关,但为什么扩展运算符突然导致在后一种情况下分配内存?

1 个答案:

答案 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按预期工作,迭代键和相应的值。