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

时间:2016-01-26 12:22:52

标签: javascript arrays

我注意到,如果我这样做:

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中的任何元素。

那么,发生了什么?

3 个答案:

答案 0 :(得分:22)

map仅对数组的已定义整数属性进行操作。 Array(n)不会设置整数属性,Array(n).fill()会设置整数属性。 不存在的属性属于undefined 的现存属性之间存在差异。

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

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

在实际术语中,如果您执行Object.keys(Array(4))(空数组)与Object.keys(Array(4).fill())(字符串"0""3"的列表),您可以看到差异。在第一种情况下,属性不存在;在他们做的第二种情况下。

答案 1 :(得分:6)

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

Array(n).fill()创建一个大小为n的数组,其中每个元素都被设置为你传递给fill或undefined的任何元素,因为你没有传递任何内容。

Array(n).fill('test')创建一个大小为n的数组,填充'test'。

答案 2 :(得分:0)

我需要使用minValue,maxValue和precision创建刻度。因此,例如,在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)