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-1
。 Array(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.prototype.fill和Array.from
ES6的Array.from()和Array.fill()方法