迭代器帮助程序已成为基准版 新推出

发布时间:2025 年 5 月 1 日

如果您编写 JavaScript,那么迭代是您经常要执行的操作。您要编写循环来处理数组,或者使用 mapfilter 等函数式编程方法和其他类似方法来处理各种数据。

不过,使用这些方法的一个难点是,它们仅适用于数组。如果您想对可迭代对象使用这些方法,则必须将其转换为数组,然后调用所需的方法。这可能会造成浪费,或者在不可使用生成器函数的情况下,使用可迭代对象表示无限数据集是不可能的。不过,现在迭代器帮助程序已成为“新推出的基准”,因此此功能终于可以在所有浏览器中使用了。

迭代器辅助函数如何运作?

通过在 Iterator 对象的 prototype 上定义新方法,可以公开迭代器辅助程序。这些方法与您习惯使用的许多函数式编程方法一致,例如 mapfilterreduce 和其他类似方法。

例如,您可以在 filter 方法上使用迭代器辅助程序,按 DOM 节点集合的 innerText 属性内容过滤列表项,然后稍后在 for 循环中使用这些项:

const posts = document.querySelectorAll("ul#specific-list > li")
  .values()
  .filter(item => item.textContent.includes("kiwi"));

// For-of loops can only be used on iterables, which `posts` is!
for (const post of posts) {
  console.log(post.textContent);
}

在上述代码段中,filter 的迭代器辅助方法用于迭代特定 <ul> 元素中的所有 <li> 元素。过滤条件是,每个元素的文本内容都必须包含 "kiwi" 的子字符串。

迭代器辅助程序还可与生成器函数搭配使用。在此示例中,生成器函数会计算阶乘,但会使用迭代器辅助程序将值过滤为可被 8 整除的值,并将前五个过滤后的值记录到控制台:

function* factorials (n) {
  let result = 1;

  for (let i = 1; i <= n; i++) {
    result *= i;

    yield result;
  }
}

const filteredFactorials = factorials(128).filter(x => x % 8 === 0);

console.log(filteredFactorials.next().value);
console.log(filteredFactorials.next().value);
console.log(filteredFactorials.next().value);
console.log(filteredFactorials.next().value);
console.log(filteredFactorials.next().value);

具体而言,前面的代码段就是一个示例,它无法使用迭代器辅助程序实现,因为阶乘的数量是无限的,无法转换为数组!

迭代器辅助程序具有很大的潜力,具体取决于您的具体情况,并且适用于以下每个可迭代方法:

迭代器辅助程序的用例非常广泛,可以显著提升开发者的工作效率。现在,这些素材资源已成为“新推出的基准素材资源”,随着时间的推移,您应该会越来越有信心地使用它们,而不必担心兼容性问题。如需了解详情,请参阅以下资源: