发布于 2026-01-06 8 阅读
0

关于 Array.map DEV 的全球展示与讲述挑战赛(由 Mux 呈现):展示你的项目!你需要知道的一切以及更多信息!

关于 Array.map,你需要知道的一切以及更多内容。

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

作为一名开发者,我发现自己在 JavaScript 代码中经常会用到这个Array.map方法。似乎在构建 Web 应用时,总有一系列事情需要处理。

题外话:我认为整个计算机科学领域都是关于管理事物列表的,但这又是另一个话题了,以后有机会再写一篇博文吧。

就像任何一款好用的软件一样,我们有时很容易忘记它的来历,以及它究竟是如何变得如此声名狼藉的。我决定借此机会深入了解一下Array.map。如果你熟悉我的博客文章,你大概已经猜到我要讲什么了……:)

这是什么Array.map

Array.map这是一个接受一个列表和一个回调函数作为参数的函数,它返回一个新列表,并将回调函数应用于原始列表中的每个元素。简单明了。以下是一个使用映射将列表中每个元素的值翻倍的示例。

> const numbers = [0, 1, 2, 3, 4];
> const doubled = numbers.map(function(value) {
  return value * 2;
});
> console.log(doubled);

根据ECMAScript 官方规范中 Array.map 的定义,提供给该函数的回调函数map需要三个参数:迭代循环中的当前值、该值的索引和数组。

何时Array.map使用?

Array.map应该在需要根据输入数组生成新的输出数组的场景中使用 `input`。如果需要修改输入数组或根本不返回任何值,最好使用 `input` forEach。我承认我经常误用 `input` 。我怀疑这是因为我大部分时间都在处理不可变数据结构,输入数据不会发生任何变化,所以我习惯于在 `input`更合适的场景中map使用 `input` 。mapforEach

地图的历史

映射是如何map成为 JavaScript 编程语言乃至许多其他编程语言的一部分的呢?不出所料,它源于数学。在数学中,映射是一种通用函数,它将一种数学结构中的值转换为另一种数学结构中的值。

映射函数于 1959 年在 Lisp 编程语言的实现中从数学领域跃升至计算机科学领域。Lisp 最初map的映射函数被实现为一个名为 `map` 的标准函数mapList。随着更新的编程语言的出现,映射函数的实用性也map从 Lisp 被移植到其他语言中。

底层使用了 Array.map 实现

上面提供的 ECMAScript 规范链接描述了 JavaScript 引擎需要实现的算法Array.map。我决定研究一下 V8 对 map 的实现以及规范算法中对应的伪代码。经过一番研究,我找到了上述算法的各个部分在 V8 代码库中的对应位置。我平时很少阅读 C++ 代码,对 V8 引擎用来表示类似列表的数据结构的模式也不太熟悉。尽管如此,我还是设法理解并找到了一些标准算法与 V8 实现之间的对应关系。欢迎在评论区补充或更正!

伪代码 描述 执行
令 O 为 ToObject(此值) 将输入值转换为对象类型。 关联
如果突然返回(O) 检查输入值是否为“空”值,例如 undefined 或空字符串。 关联
令 len 为 ToLength(Get(O, "length")) 获取输入对象的长度,以便用于构建新数组。 关联
如果突然返回(len) 检查长度是否为零或空值。
如果 IsCallable(callbackfn) 为 false,则抛出 TypeError 异常 检查回调函数是否可以被调用 关联
如果提供了 thisArg,则令 T 为 thisArg;否则令 T 为 undefined。 this如果给定,则设置回调函数作用域内的值。
令 A 为 ArraySpeciesCreate(O, len) len创建一个指定长度的新数组。
如果突然返回(A) 检查是否创建了空数组。
设 k 为 0。从 k 到 len 循环构建 A 遍历输入数组,并对每个值调用回调函数来构建输出数组。 关联

请注意,由于标准中实现的算法是标准,因此其他 JavaScript 引擎也将实现相同的算法。

以上就是关于这方面的讨论mapmap你的代码中是否大量使用了这种结构?你是否觉得使用这种结构map促使你编写更多利用不可变数据结构的代码?

文章来源:https://dev.to/captainsafia/everything-you-needed-to-know-and-more-about-array-map-4a9b