映射在新的Array()上而不填充它会返回一个空数组。为什么呢?

时间:2017-11-15 21:37:47

标签: javascript arrays ecmascript-6

谜我这个。

让我们说你新建了一个包含1,000个元素的数组,并希望使用.map()将每个元素的索引指定为元素的值。我希望它能像这样工作:

new Array(1000).map((element, i) => i);

问题在于:尽管将.map()的返回值指定为数组索引,但返回的新数组虽然具有所需的1,000个元素,但仍为空。这可以通过链接.fill(0)来解决,如下所示:

new Array(1000).fill(0).map((element, i) => i);

但为什么?

为什么.map.filter需要填充数组来生成填充数组?

2 个答案:

答案 0 :(得分:1)

主要是因为必须填充数组,即使使用未定义的指针也要进行迭代。使用new Array()时不是。

  

MDC(强调我的):" map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组。仅对已分配值的数组的索引调用回调;对于已删除或从未分配过值的索引,不会调用它。"

根据该主题的接受答案的第一条评论:

JavaScript "new Array(n)" and "Array.prototype.map" weirdness

答案 1 :(得分:1)

要使其正常工作,您可以使用ECMA6中的传播运算符

console.log([...new Array(1000)].map((element, i) => i))