2017-05-07 54 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