Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
为数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。该函数被调用时将传入以下参数:
element数组中当前正在处理的元素。
index正在处理的元素在数组中的索引。
array调用了 map() 的数组本身。
thisArg 可选执行 callbackFn 时用作 this 的值。参见迭代方法。
一个新数组,每个元素都是回调函数的返回值。
map() 方法是一个迭代方法。它为数组中的每个元素调用一次提供的 callbackFn 函数,并用结果构建一个新数组。
callbackFn 仅在已分配值的数组索引处被调用。它不会在稀疏数组中的空槽处被调用。
map() 方法是一个复制方法。它不会改变 this。然而,作为 callbackFn 提供的函数可以更改数组。请注意,在第一次调用 callbackFn 之前,数组的长度已经被保存。因此:
警告:上述类型的并发修改经常导致难以理解的代码,通常应避免(特殊情况除外)。
map() 方法是通用的。它只期望 this 值具有 length 属性和整数键属性。
由于 map 创建一个新数组,在没有使用返回的数组的情况下调用它是不恰当的;应该使用 forEach 或 for...of 作为代替。
下面的代码创建了一个新数组,值为原数组中对应数字的平方根。
以下代码使用一个包含对象的数组来重新创建一个格式化后的数组。
下面的代码表示了当函数需要一个参数时 map 的工作方式。当 map 循环遍历原始数组时,这个参数会自动被分配成数组中对应的每个元素。
map() 方法读取 this 的 length 属性,然后访问每个整数索引。
以下示例展示了如何去遍历通过 querySelectorAll 得到的对象集合。这是因为 querySelectorAll 返回的是一个对象集合 NodeList。
在这种情况下,我们返回屏幕上所有选中 option 的值:
一种更简单的方式是用 Array.from() 方法。
稀疏数组在使用 map() 方法后仍然是稀疏的。空槽的索引在返回的数组中仍然为空,并且回调函数不会对它们进行调用。
通常情况下,我们使用只有一个参数(即正在遍历的元素)的回调函数。尽管某些函数可以接受额外的可选参数,但在实际应用中,我们通常只传递一个参数。这种习惯可能会导致一些令人困惑的现象。
考虑下例:
我们期望输出 [1, 2, 3], 而实际结果是 [1, NaN, NaN].
parseInt 函数通常只使用一个参数,但其实可以传入两个参数。第一个参数是表达式,第二个参数是解析该表达式的基数。当在 Array.prototype.map 的回调函数中使用 parseInt 函数时,map 方法会传递 3 个参数:
parseInt 函数会忽略第三个参数,但是不会忽略第二个参数!这可能会导致一些问题。
以下是迭代步骤的简明示例:
下面让我们来讨论解决方案:
使用 parseInt 作为参数调用 map 方法,输出运行如下:
当返回 undefined 或没有返回任何内容时:
| ECMAScript® 2027 Language Specification # sec-array.prototype.map |
启用 JavaScript 以查看此浏览器兼容性表。