我在我的代码中找到了有趣的问题。 Here是我的代码的简化版本。每次调用时,调用regex.test
都会更改其输出值。您可以尝试在devtools中使用select'进行评估。它会告诉你不同的价值观。
答案 0 :(得分:6)
问题是你在正则表达式中使用/g
- 当使用它时,正则表达式被执行多次,它将始终从上次停止的地方开始。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex
仅当正则表达式实例使用" g"时才设置此属性。标志以指示全局搜索。以下规则适用:
如果lastIndex大于字符串的长度,则test()和exec()失败,则lastIndex设置为0.
如果lastIndex等于字符串的长度,并且正则表达式与空字符串匹配,则正则表达式匹配从lastIndex开始的输入。
如果lastIndex等于字符串的长度,并且正则表达式与空字符串不匹配,则正则表达式输入不匹配,lastIndex重置为0.
否则,lastIndex将设置为最近一次匹配后的下一个位置。
您可以在循环中执行console.log(regex.lastIndex)
来验证这一点:
for (var a = 0; a < 10; a++) {
console.log(regex.lastIndex)
if (!regex.test(inner)) {
log.innerHTML += "true";
}
else {
log.innerHTML += "false";
}
log.innerHTML += " ";
}
你会看到它在0 18之间交替。因此,当它从0开始时,它匹配,当它从18开始时,它不匹配。