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

时间:2016-08-13 13:06:40

标签: javascript regex

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

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全局修饰符时它才有效?

1 个答案:

答案 0 :(得分:0)

如果您查看MDN documentation of test,您会发现它不是纯函数,但它有副作用会改变您的PS C:\> [object]$x = 'abc','def' PS C:\> $x = $null PS C:\> $x += 'abc' PS C:\> $x += 'def' PS C:\> $x abcdef 变量:

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

test()将超过上一个匹配

当使用<input type="submit" class="button primary" value="Submit" accesskey="s"> 修饰符时,在耗尽所有匹配(即第一次迭代)之后,正则表达式位置将位于字符串的末尾,它将不匹配,但似乎存在未定义的行为,这会重置正则字符串位置到字符串的开头(根据您在第3次迭代时观察到的结果)

没有全局修饰符,正则表达式可以从起始位置多次执行