首页 > 解决方案 > 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);

标签: javascriptregex

解决方案


.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返回迭代器而不是数组,请参阅此处- 简而言之,它允许在(有些不寻常的)情况下进行性能优化,即在检索所有可能的匹配项之前可能希望摆脱对字符串的迭代.


推荐阅读