2017-05-07 55 views
2

我发现在我的代码有趣的问题。 Here是我的代码的简化版本。调用regex.test会在您每次拨打电话时更改其输出值。你可以尝试在devtools中做到这一点,'选择评估',它会显示你不同的值。Bug与RegExp.test(JavaScript)

回答

4

问题是,您在正则表达式中使用的是/g - 使用此类时,正则表达式会多次执行,它会始终从上次停止的位置开始。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex

此属性设置仅在正则表达式实例所使用的“G”标志,以表明全局搜索。以下规则:

如果lastIndex的比串,测试()和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 ,它不匹配。

+0

非常感谢 – Herrgott