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

3
两者之间有什么区别?
// Chrome console

Array(2);                   // [undefined × 2]
Array(2).map(() => 1);      // [undefined × 2]

[...Array(2)];              // [undefined, undefined]
[...Array(2)].map(() => 1); // [1, 1]

根据什么是数组空槽?,它似乎与内存分配有关,但是为什么在后一种情况下展开运算符会突然导致内存被分配?


1
[...Array(2)] 相当于 [undefined, undefined]。这就是展开运算符的作用。 - Paul
但是[undefined × 2]不等同于[undefined, undefined](?) - neverendingqs
1
不是的,就像你链接的问题(以及它的副本)所说的那样。 - JJJ
1个回答

6

关于Array构造函数

所有这些调用方式是等效的:

  • Array(2)
  • new Array(2)
  • var a = []; a.length = 2

它们之间的等价性在于它们为赋值分配了内存,但不创建索引。

Object.keys(Array(2)) // [].

这就是为什么当您执行

Array(2).map(() => 1); // [undefined × 2]

时,您基本上没有改变任何内容,因为没有迭代发生在数组上,因为缺少迭代索引键,而map在迭代数组时使用这些索引键。

关于展开运算符

... 运算符调用数组的 [Symbol.iterator],即内置的 values() 迭代器,即使没有键索引也会迭代值。

这就是为什么我们的输出结果是一个新的数组,其中包含明确定义的带有键索引的 undefined 值。

Object.keys([...Array(2)]) // ["0", "1"].

之后,map按预期工作,遍历键和相应的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接