gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:05:07 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这在 proposal document 中有描述。 :

Many use cases may want an array of matches - however, clearly not all will. Particularly large numbers of capturing groups, or large strings, might have performance implications to always gather all of them into an array. By returning an iterator, it can trivially be collected into an array with the spread operator or Array.from if the caller wishes to, but it need not.

.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返回一个数组,并在创建数组时立即迭代所有匹配项,因此无法退出。

关于javascript - 为什么 Javascript 中的新 "matchAll"返回一个迭代器(相对于一个数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com