Aby obejść ten problem, można usunąć flagę g
lub zresetować lastIndex
jak w
var reg = /a/g;
console.log(reg.test("a"));
reg.lastIndex = 0;
console.log(reg.test("a"));
Powstaje problem, ponieważ test
opiera się exec
który wygląda na więcej meczów Po pierwsze, jeśli przeszły ten sam ciąg i flaga g
jest obecna.
15.10.6.3RegExp.prototype.test(string)
# Ⓣ Ⓡ
Następujące kroki są podejmowane:
- Niech mecz być wynikiem oceny algorytmu
RegExp.prototype.exec
(15.10.6.2) po tym RegExp
obiektu przy użyciu ciąg jako argument.
- Jeśli pasuje do, to nie jest
null
, następnie zwraca true
; w przeciwnym razie zwróci false
.
Kluczową częścią exec
jest krok 6 15.10.6.2:
6. Niech globalny być wynikiem wywołanie [[Pobierz]] Metoda wewnętrznej R z argumentem "globalny".
7. Jeśli globalne jest fałszywy, to niech i = 0.
Kiedy i
nie jest resetowany do 0, następnie exec
(a więc test
) nie zacząć szukać na początku łańcucha.
Jest to przydatne dla exec
ponieważ można pętla obsłużyć każdy mecz:
var myRegex = /o/g;
var myString = "fooo";
for (var match; match = myRegex.exec(myString);) {
alert(match + " at " + myRegex.lastIndex);
}
ale oczywiście to nie jest tak przydatne dla test
.
Co oznacza, że powinienem ustawić lastIndex na 0, prawda? – NStal
+1 dobre wytłumaczenie, nie wiedziałem o tym. –
@NStal, Tak, ustawienie opcji 'lastIndex' na 0 przed testowaniem spowoduje obejście problemu. –