4

ES2020 包含一个新String.prototype.matchAll方法,它返回一个迭代器。我确定我错过了一些愚蠢/明显的东西,但我不明白为什么它不只是返回一个数组。

有人可以解释那里的逻辑吗?

编辑:为了澄清评论中的一些内容,我假设迭代器没有简单地替换数组,因为所有 JS API 的新方式都将返回多个值。如果我错过了该备忘录,并且所有新的 JS 函数都返回迭代器,那么指向该备忘录的链接将 100% 符合有效答案。

但同样,我怀疑并没有做出如此全面的改变,并且 Javascript 的制造者为这个特定的方法做出了一个特定的选择,让它返回一个迭代器......而这个选择的逻辑就是我的我试图理解。

4

1 回答 1

6

这在提案文件中有所描述:

许多用例可能需要一系列匹配项 - 但是,显然并非所有用例都需要。特别大量的捕获组或大字符串可能会影响性能,以便始终将它们全部收集到一个数组中。通过返回一个迭代器,如果调用者愿意,它可以很容易地用扩展运算符或 Array.from 收集到一个数组中,但它不需要。

.matchAll懒惰。使用迭代器时,正则表达式只会在先前的匹配被迭代后评估字符串中的下一个匹配。这意味着如果正则表达式很昂贵,则可以提取前几个匹配项,然后您的 JS 逻辑可以使迭代器避免尝试进一步的匹配。

有关惰性求值的简单示例:

for (const match of 'axxxxxxxxxxxxxxxxxxxxxxxxxxxxy'.matchAll(/a|(x+x+)+y./g)) {
  if (match[0] === 'a') {
    console.log('Breaking out');
    break;
  }
}
console.log('done');

如果没有break,正则表达式将继续尝试第二次匹配,这将导致非常昂贵的操作。

如果matchAll返回一个数组,并在创建数组时立即遍历所有匹配项,则无法退出。

于 2020-10-26T23:40:24.037 回答