javascript - Javascript 正则表达式 matchAll:为什么需要休息运算符?
问题描述
在此示例中https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll
为什么
const array = [...str.matchAll(regexp)];
而不仅仅是
const array = str.matchAll(regexp);
解决方案
.matchAll
返回一个迭代器。要从迭代器创建一个数组,将迭代器传播到一个数组中是最简洁的方法之一。
如果您需要一个数组,那么对于任何迭代器都是如此,而不仅仅是matchAll
.
但是,如果您只需要迭代迭代器,则不一定需要创建数组。您也可以使用for..of
来进行迭代,而无需先转换为数组,例如:
for (const match of str.matchAll(regexp)) {
// do something with match
}
如果您不首先将迭代器转换为数组,并使用链接示例中的代码,则记录普通结果不会提供太多信息:
const regexp = /t(e)(st(\d?))/g;
const str = 'test1test2';
const iter = str.matchAll(regexp);
console.log(iter);
在控制台中,您所看到的只是一个RegExpStringIterator
没有属性的对象。
如果您想知道为什么 matchAll
返回迭代器而不是数组,请参阅此处- 简而言之,它允许在(有些不寻常的)情况下进行性能优化,即在检索所有可能的匹配项之前可能希望摆脱对字符串的迭代.
推荐阅读
- python - 为什么梯度下降在 pytorch 中不能按预期工作
- powershell - 如何防止 PowerShell -Recurse 两次重命名第一个文件?
- java - Spring 5.1.5.RELEASE 我应该怎么想选择一个 JVM 版本
- c# - 如何检测表单何时从一个屏幕更改为另一个屏幕
- python - 亚马逊价格网络抓取问题与 python、请求和 bs4
- .net-core - NET Core API:414 请求 uri 太长
- c# - 使用 System.Management.Automation 时如何访问 .NET Core 中的 CimCmdlet?
- sql - 带有 UNION 子句和 WHERE 子句的 VBA-ACCESS DAO SQL
- python - 静态构建的 python 代码无法解析 DNS 名称
- r - 如何使用 R 从 Google 驱动器中的特定文件夹下载文件?