为什么这个RegExp执行导致无限循环



我有以下代码块:

var field,
    reg = new RegExp('{{.*?}}', 'i'),
    text = 'This is a string with 1: {{param1}}, 2: {{param2}} and 3: {{param3}} parameters.';
while (field = reg.exec(text)) {
    console.log(field);
}

如果我包含一个g全局标志,循环运行良好。但是,如果它不是全局的,那么reg.exec(text);应该在第一次匹配后返回null并结束while循环?

试图理解背后的原因,如果有人能详细说明我将不胜感激。

RegExp.prototype.exec()的MDN文档在解释RegExp对象的lastIndex属性的值时具有我认为的答案:

开始下一次匹配的索引。当"g"不存在时,该值将保持为0。

所以每次在RegExp对象上调用.exec()时,它将再次从字符串的开始开始。如果至少有一个匹配项,这意味着它将始终找到匹配项,并且循环永远不会结束。

这是因为RegExp.prototype.exec结合g标志实际上改变了RegExp实例本身的开始索引。

另一方面,没有g标志,它不会改变,因此它总是返回第一个结果,如果它匹配你的while循环将会大猩猩

最新更新