Iterator.prototype.map()

基准线 2025
新推出

自 ⁨2025 年 3 月⁩ 起,此功能可在最新的设备和浏览器版本上使用。此功能可能在旧设备或浏览器上无法正常工作。

map() 方法用于 Iterator 实例,它会返回一个新的 iterator helper 对象,该对象会根据映射函数对迭代器产生的每个元素进行转换并产生(yield)这些转换后的元素。

语法

js
map(callbackFn)

参数

callbackFn

一个将为迭代器产生的每个元素执行的函数。其返回值将由 iterator helper 产生。该函数将以以下参数调用:

element

正在处理的当前元素。

index

正在处理的当前元素的索引。

返回值

一个新的 iterator helper 对象。每次调用 iterator helper 的 next() 方法时,它会从底层迭代器获取下一个元素,应用 callbackFn,然后产生返回值。当底层迭代器完成时,iterator helper 也随之完成(next() 方法会产生 { value: undefined, done: true })。

描述

迭代器助手(iterator helpers)相较于数组方法的主要优势在于它们是惰性的,这意味着它们只在被请求时才生成下一个值。这避免了不必要的计算,也使得它们可以与无限迭代器一起使用。map() 方法允许你创建一个新的迭代器,当被迭代时,它会产生转换后的元素。

示例

使用 map()

以下示例创建了一个产生斐波那契数列各项的迭代器,将其转换为一个每项都取平方的新序列,然后读取前几项。

js
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const seq = fibonacci().map((x) => x ** 2);
console.log(seq.next().value); // 1
console.log(seq.next().value); // 1
console.log(seq.next().value); // 4

在 for...of 循环中使用 map()

map() 在你不需要手动处理迭代器时最为方便。由于迭代器本身也是可迭代的,你可以使用 for...of 循环来迭代返回的 helper。

js
for (const n of fibonacci().map((x) => x ** 2)) {
  console.log(n);
  if (n > 30) {
    break;
  }
}

// Logs:
// 1
// 1
// 4
// 9
// 25
// 64

这等价于

js
for (const n of fibonacci()) {
  const n2 = n ** 2;
  console.log(n2);
  if (n2 > 30) {
    break;
  }
}

规范

规范
ECMAScript® 2026 语言规范
# sec-iterator.prototype.map

浏览器兼容性

另见