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;
}