【发布时间】:2021-05-07 16:15:41
【问题描述】:
Array.prototype.map 函数在应用于具有undefined 值的数组时按预期工作:
const array = [undefined, undefined, undefined];
console.log(array.map(x => 'x')); // prints ["x", "x", "x"]
但是,当在具有空槽的稀疏数组上使用 map 时,它不会像前面的示例那样将它们映射到“x”。相反,它返回 undefined 值:
const array = [,,,];
console.log(array.map(x => 'x')); // prints [undefined, undefined, undefined]
即使我们有一个混合了空槽和实际值的数组,也只有后者被映射:
const array = [,'a',,'b',];
console.log(array.map(x => 'x')); // prints [undefined, "x", undefined, "x"]
相比之下,我注意到Array.prototype.join 在空槽上工作:
const array = [,,,,];
console.log(array.join('x')); // prints "xxx"
为什么join 将空槽视为有效元素,而map 则不?
此外,在join documentation 中,他们提到如果元素是undefined、null 或empty array [],则将其转换为空字符串。他们没有提到空槽,但似乎他们也在将它们转换为空字符串。
这是否是 MDN 文档中的问题?为什么不让join 也像map 一样忽略空槽呢?这似乎是文档中的问题或join 的实现中的问题。
【问题讨论】:
-
因为它是这样定义的。它通过不通过空槽来处理稀疏数组。与任何数组迭代方法的行为相同:
some、reduce、filter等。 -
从您链接的文档中:“map 按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组。回调仅对索引调用分配了值的数组(包括未定义的)。"
-
我不知道为什么会很奇怪。如果您有一个稀疏的对象数组并且想要执行
objs.map(o => o.id)之类的操作,则您不需要空值守卫,也不需要更改结果的数量。这似乎完全合乎逻辑。我的参考实际上是规格。您可以查看MDN documentation,它描述了这一点并链接到相关规格。 -
我明白你们的意思了。
map文档没有明确提及空槽。实际上,一般来说,它们周围的文档很少。但是,是的,这确实是有道理的。 -
@AlbertoTrindadeTavares 它说:“map 调用提供的回调函数为数组中的每个元素调用一次” - 强调就在链接中。在该段落之后,它明确表示“不需要数组的缺失元素;即:从未设置的索引;已删除的索引;或从未分配过值的索引。”它实际上只是列举了一个空槽的所有可能性。这对我来说似乎很明确。
标签: javascript arrays