我注意到,如果我这样做:
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
中的任何元素。
那么,发生了什么?
答案 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)