为什么 Javascript return 中的新 "matchAll" 是迭代器(相对于数组)?
Why does the new "matchAll" in Javascript return an iterator (vs. an array)?
ES2020 包含一个新的 String.prototype.matchAll
方法,它 return 是一个迭代器。我确定我遗漏了一些东西 dumb/obvious,但我不明白为什么它不只是 return 一个数组。
有人可以解释一下其中的逻辑吗?
编辑: 只是为了从评论中澄清一些事情,我假设迭代器并没有简单地替换数组,因为所有 JS API 未来都会采用新的方式return 多个值。如果我错过了那个备忘录,并且所有新的 JS 函数都执行 return 迭代器,那么对所述备忘录的 link 将 100% 符合有效答案。
但是,我再次怀疑 并没有 做出这样的全面改变,Javascript 的制造者针对这种特定方法做出了特定的选择,让它成为 return 一个迭代器…… 选择的逻辑正是我想要理解的。
这在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
返回一个数组,并在创建数组时立即遍历所有匹配项,将无法退出。
ES2020 包含一个新的 String.prototype.matchAll
方法,它 return 是一个迭代器。我确定我遗漏了一些东西 dumb/obvious,但我不明白为什么它不只是 return 一个数组。
有人可以解释一下其中的逻辑吗?
编辑: 只是为了从评论中澄清一些事情,我假设迭代器并没有简单地替换数组,因为所有 JS API 未来都会采用新的方式return 多个值。如果我错过了那个备忘录,并且所有新的 JS 函数都执行 return 迭代器,那么对所述备忘录的 link 将 100% 符合有效答案。
但是,我再次怀疑 并没有 做出这样的全面改变,Javascript 的制造者针对这种特定方法做出了特定的选择,让它成为 return 一个迭代器…… 选择的逻辑正是我想要理解的。
这在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
返回一个数组,并在创建数组时立即遍历所有匹配项,将无法退出。