NodeJs 中“Object [RegExp String Iterator] {}”的含义是什么

Sam*_*mos 2 regex node.js

我一直在尝试matchAll在 node.js 中使用,但是当我运行代码并记录返回值时,它只显示Object [RegExp String Iterator] {}.

您能帮我理解为什么会出现这种情况吗?

Che*_*yDT 8

请注意您正在处理的事物的类型。

引用以下文档String.prototype.matchAll

matchAll()方法返回与字符串与正则表达式匹配的所有结果的迭代器,包括捕获组。

(强调我的。)

所以,你得到一个迭代器。什么是迭代器?嗯,文档说:

在 JavaScript 中,迭代器是一个对象,它定义了一个序列,并可能在其终止时定义一个返回值。

[...]

虽然很容易想象所有迭代器都可以表示为数组,但事实并非如此。数组必须完整分配,但迭代器仅在必要时使用。因此,迭代器可以表达无限大小的序列,例如0和之间的整数范围Infinity

因此,matchAll 只会在您请求时通过询问迭代器的下一个值来完成查找下一个匹配的实际工作,并且必须保留的状态量不会因较长的字符串而增加那么多,因为不会所有比赛都必须立即记住。这就是迭代器(及其相反的部分,生成器)的美妙之处。

这也是为什么在打印迭代器时你不会在控制台中看到所有结果 - 否则,当它的返回值仅仅记录到控制台matchAll时,非常大的字符串上的 a 会导致长时间的延迟和高 CPU 使用率,这没有意义。


matchAll您可以在循环中使用 in 的结果for of,每次循环重复时都会查找下一个匹配项:

for (const match of 'abcde'.matchAll(/./g)) {
  console.log(match)
}

// Prints 5 times something like ['a', index: 0, input: 'abcde', groups: undefined ]
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意放弃按需匹配的好处,您可以一次从迭代器中提取所有值,并使用扩展语法或将它们放入数组中Array.from

const allMatches = [...'abcde'.matchAll(/./g)]
// - or -
const allMatches = Array.from('abcde'.matchAll(/./g))
Run Code Online (Sandbox Code Playgroud)

(事实上​​,扩展语法也显示在matchAll文档最顶部的示例中。)