为什么在循环regexObj.test(str)时记录每次迭代的不同结果

Why when looping regexObj.test(str) is logging each iteration different result?

本文关键字:迭代 结果 记录 regexObj 循环 test str 为什么      更新时间:2023-09-26

下面的代码记录每次迭代的不同结果

var re = /[a-z]+/g;
var str= 'test';
for(var i = 0; i < 5; i++) {
    console.log(re.test(str));
}
// result : first iteration logs `true`, second `false`, third `true` ...

谁能解释一下,为什么会这样?为什么它工作时,/g全局修饰符被删除?

如果您检查test的MDN文档,您会发现它不是一个纯函数,但它有一个副作用,改变了您的re变量:

在同一个全局正则表达式实例上多次调用

test()将超越前一个匹配

当使用/.../g修饰符时,在耗尽所有匹配(即第一次迭代)之后,regex位置将位于字符串的末尾,它将不匹配,但似乎有一种未定义的行为,将regex位置重置为字符串的开头(根据您在第三次迭代中观察到的)

如果没有全局修饰符,regex可以从起始位置

执行多次。