JavaScript映射:为什么这不起作用?
我试图用map生成一些随机数据。令我惊讶的是,我不明白为什么这段代码不起作用 请考虑以下代码段,该代码段按预期工作: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 =>
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:很好!ofMath.random
不使用this
或Array.from({length:2},Math.random)代码>这意味着什么都没有,初始值是不相关的,应用的值是Math.random()。你也应该从第一个例子起作用的事实中认识到这一点。.map方法本质上是数组中每个元素的赋值。我不明白。我想说的是,做数组(2)并不是用元素填充数组。只是定义长度。在做[undefined,undefined]时,你用元素填充数组,所以map函数将迭代元素IIlight,从你所说的我得到的印象是,你暗示它们是一个相同的元素,也就是说,初始化一个大小为2的数组会创建[undefined,undefined],这会得到与第一个示例相同的结果。可能是有人投票否决你的原因,但我不知道(不是我)。“你可以查看Array\map
的规范。”MDN不是“规范”。它是辅助文档。(非常好的辅助文档)是规范。