Perché il seguente passaggio da true
a false
;Perché RegEx.test modifica il risultato nelle chiamate successive?
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
e poi procedi commutazione true
, false
, true
, false
......
Perché il seguente passaggio da true
a false
;Perché RegEx.test modifica il risultato nelle chiamate successive?
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
e poi procedi commutazione true
, false
, true
, false
......
suo perché della bandiera g
. Comincia a ricordare l'ultimo indice della partita e quando fai la prossima volta il r.test
, inizia da quell'indice. Ecco perché si alterna tra true
e false
. Prova questo
var r = /e/gi;
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
console.log(r.lastIndex);
# 0
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
Citando MDN documentazione su RegExp.lastIndex
,
Il
lastIndex
è una struttura intero di lettura/scrittura di espressioni regolari che specifica l'indice a cui iniziare la prossima partita. ...Questa proprietà viene impostata solo se l'espressione regolare utilizza il flag "g" per indicare una ricerca globale. Valgono le seguenti regole:
- Se
lastIndex
è maggiore della lunghezza della stringa,test()
eexec()
sicuro, quindilastIndex
è impostato a 0.- Se
lastIndex
è uguale alla lunghezza della stringa e se la l'espressione regolare corrisponde alla stringa vuota, quindi l'espressione regolare corrisponde all'ingresso a partire dalastIndex
.- Se
lastIndex
è uguale alla lunghezza della stringa e se l'espressione regolare non corrisponde alla stringa vuota, allora il regolare ingresso disallineamenti di espressione, elastIndex
viene resettato a 0.- Altrimenti,
lastIndex
è impostato la prossima posizione dopo la partita più recente.
Il testo in grassetto sopra risponde al comportamento osservato. Dopo la prima partita, e
, lo lastIndex
è impostato su 1
, per indicare l'indice da cui provare la prossima corrispondenza. Secondo il terzo punto visto sopra, poiché il lastIndex
è uguale alla lunghezza della stringa e l'espressione regolare non corrisponde alla stringa vuota, restituisce false
e ripristina lastIndex
a 0.