Array(n) 和 Array(n).fill 之间的区别?

Posted

技术标签:

【中文标题】Array(n) 和 Array(n).fill 之间的区别?【英文标题】:Difference between Array(n) and Array(n).fill? 【发布时间】:2016-05-03 00:17:51 【问题描述】:

我注意到如果我这样做:

Array(n).map(() => console.log('test'))

我什么也没打印出来。

但是如果我这样做:

Array(n).fill().map(() => console.log('test'))

我得到test 打印出n 次。

为什么会这样?如果我这样做Array(n).length,我会返回n

我在 REPL 中注意到 Array(5) 返回:

[ , , , , ]

Array(5).fill() 返回:

[ undefined, undefined, undefined, undefined, undefined ]

在这两种情况下,typeof 数组中的任何元素 === undefined

那么,发生了什么事?

【问题讨论】:

【参考方案1】:

我需要使用 minValue、maxValue 和精度来创建刻度。因此,例如,当 minValue = 5、maxValue = 7、precision = 0.5 时,我应该得到数组 [5, 5.5, 6, 6.5, 7]。我使用了以下内容(基于上面的答案):

const tickCount = ((maxValue - minValue) / precision) + 1
const ticks = Array(tickCount)
  .fill()
  .map((x, i) => minValue + i * precision)

【讨论】:

【参考方案2】:

map 仅对数组的已定义整数属性进行操作。 Array(n) 不设置整数属性,而 Array(n).fill() 设置。 不存在的属性值为undefined的现存属性之间存在区别

Array(n) 设置数组的length 属性,但它不设置任何属性。数组对象没有任何整数属性。

.fill 将数组的所有整数属性设置为从零到比length 小一。当您执行Array(n) 时,您设置了新数组的length 属性,然后.fill() 定义并将每个整数属性设置为n-1Array(n).fill() 创建的数组确实 具有定义为length - 1 的属性。 (属性恰好设置为undefined,因为您没有将参数传递给fill,但它们确实存在。)

实际上,如果您使用Object.keys(Array(4))(空数组)与Object.keys(Array(4).fill())(字符串列表"0""3"),您可以看到区别。在第一种情况下,属性不存在;在第二种情况下,他们会这样做。

【讨论】:

【参考方案3】:

Array(n) 创建一个大小为 n 的新数组,内容尚未定义。

Array(n).fill() 创建一个大小为 n 的数组,其中每个元素都设置为您传递给 fill 的任何内容,或者在您的情况下为 undefined,因为您什么也没传递。

Array(n).fill('test') 创建一个大小为 n 且填充了“测试”的数组。

【讨论】:

以上是关于Array(n) 和 Array(n).fill 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

fill array, show arrary , reverse_array

array

理解Array.prototype.fill和Array.from

ES6的Array.from()和Array.fill()方法

C# for-loop 和 Array.Fill 之间的性能差异

array_fill 填充数组内容