爲什麼JavaScript中正則表達式的test方法會出錯?

一段這樣的JavaScript代碼,猜猜結果如何?

var i = 0, m = 20, a = [], r = /^\d+$/g;
for(i = 0; i < m; i++){
a.push('' + i);
}
m = a.length;
for(i = 0; i < m; i++){
if(r.test(a[i])){
document.write(a[i] + 'true<br />');
}
else{
document.write(a[i] + 'false<br />');
}
} 也許你期待的結果應該全是true,可是實際結果呢?true和false交替出現,0是true,1是false,2是true,3是false……是不是很懷疑?其實仔細看一下,那個正則表達式多了個全局選項“g”,去掉就好了。

可是爲什麼有“g”就會出錯呢?

原因其實很簡單,當一個模式具有全局選項時,和exec一樣,每次test都會保留上次匹配的位置——即lastIndex。很顯然,當第一次匹配之後,第二次匹配時的lastIndex已經到了字符串末尾,儘管這個時候字符串已經是一個新的字符串了,但是這個lastIndex的位置並沒有重新初始化,所以會從末尾開始匹配——當然會匹配失敗了。

解決方案有兩種:


去掉正則表達式後面的g;
每次完成匹配之後重置模式的lastIndex屬性;


使用重置lastIndex的代碼:

var i = 0, m = 20, a = [], r = /^\d+$/g;
for(i = 0; i < m; i++){
a.push('' + i);
}
m = a.length;
for(i = 0; i < m; i++){
if(r.test(a[i])){
document.write(a[i] + 'true<br />');
}
else{
document.write(a[i] + 'false<br />');
}
r.lastIndex = 0;
}
發佈了26 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章