JavaScript映射:为什么这不起作用?

JavaScript映射:为什么这不起作用?,javascript,arrays,Javascript,Arrays,我试图用map生成一些随机数据。令我惊讶的是,我不明白为什么这段代码不起作用 请考虑以下代码段,该代码段按预期工作: const empty = [undefined, undefined]; const rand = empty.map(item => Math.random()); Output: [0.4774752874308936, 0.8482276976659398] 我试着简化一下,并做了以下工作 const rand = Array(2).map(item =>

我试图用map生成一些随机数据。令我惊讶的是,我不明白为什么这段代码不起作用

请考虑以下代码段,该代码段按预期工作:

const empty = [undefined, undefined];
const rand = empty.map(item => Math.random());

Output: [0.4774752874308936, 0.8482276976659398]
我试着简化一下,并做了以下工作

const rand = Array(2).map(item => Math.random())

Output: [undefined × 2]
我无法理解为什么会发生这种情况。显然,由Array(n)和[]生成的两个数组都是典型的数组,都具有所有的原型方法

Array(2) instanceof Array
true

[undefined, undefined] instanceof Array
true

Array.isArray(Array(2))
true

Array.isArray([undefined, undefined])
true
有人能指出我的错误在哪里吗?

数组(2)
提供长度为
2
空数组。JavaScript数组本质上是稀疏的(它们可能会有洞,因为1),这就是
Array(2)
所提供的。看起来是这样的:

+−−−−−−−−−−−−−−+ | (array) | +−−−−−−−−−−−−−−+ | length: 2 | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | (array) | +−−−−−−−−−−−−−−+ | length: 2 | | 0: undefined | | 1: undefined | +−−−−−−−−−−−−−−+
map
forEach
,以及
数组上的大多数(但不是全部)相关方法。prototype
仅循环遍历稀疏数组的实际条目。由于
array(2)
返回的数组没有任何实际条目,因此永远不会调用您的回调

添加了ES2015(可填充),可用于填充阵列:

const rand=Array(2.fill().map(Math.random)

控制台日志(rand)您可以查看以下各项的规格:

对于数组中缺少的元素(即从未设置、已删除或从未赋值的索引),不会调用它

您可以使用Array.apply获取带有映射的iterabel数组


console.log(Array.apply(null,{length:2}).map(Math.random))您正在创建一个初始化大小为2的数组。但这些立场中没有任何因素。那你就这样做了
[未定义,未定义].map(item=>Math.random())


您有一个包含两个未定义元素的数组。

这是因为您假设JavaScript引擎对
数组(2)
的解释有点像这样:“创建一个数组对象,其中两个条目初始化为默认值,比如0或
未定义的

实际上,JavaScript引擎创建了一个新对象,并将其
length
属性设置为2。它没有任何真正的内容

检查这个非常简单的示例:

var-arr=新数组(2);

控制台日志(arr)顺便说一句-您可以使用
fill
-
Array(2).fill(null).map(item=>Math.random())
还有
const rand=[…Array(2)].map(item=>Math.random());-)喜欢这个:)甚至更短:
[…Array(2)].map(Math.random)
@Me.Name:很好!of
Math.random
不使用
this
Array.from({length:2},Math.random)这意味着什么都没有,初始值是不相关的,应用的值是Math.random()。你也应该从第一个例子起作用的事实中认识到这一点。.map方法本质上是数组中每个元素的赋值。我不明白。我想说的是,做数组(2)并不是用元素填充数组。只是定义长度。在做[undefined,undefined]时,你用元素填充数组,所以map函数将迭代元素IIlight,从你所说的我得到的印象是,你暗示它们是一个相同的元素,也就是说,初始化一个大小为2的数组会创建[undefined,undefined],这会得到与第一个示例相同的结果。可能是有人投票否决你的原因,但我不知道(不是我)。“你可以查看
Array\map
的规范。”MDN不是“规范”。它是辅助文档。(非常好的辅助文档)是规范。