为什么 Javascript 中的新“matchAll”返回一个迭代器(相对于数组)?

mac*_*ost 3 javascript regex ecmascript-2020

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

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

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

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

Cer*_*nce 5

提案文件中对此进行了描述:

许多用例可能需要一组匹配项 - 但是,显然并非所有人都愿意。特别大量的捕获组或大字符串可能会对性能产生影响,因为总是将它们全部收集到一个数组中。通过返回一个迭代器,如果调用者愿意,可以使用扩展运算符或 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');
Run Code Online (Sandbox Code Playgroud)

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

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