Wiem, że jest kilka rozbieżności pomiędzy regex/lastIndex
, ale ten jest dla mnie nowy!Regex/lastIndex - Nieoczekiwane zachowanie
Oczekiwane zachowanie: Tworzenie nowego wyrażenia regularnego (z dosłownym/konstruktora) będzie, oczywiście, należy utworzyć nowy obiekt RegExp z lastIndex
nieruchomości ustawiony na zero.
Rzeczywiste zachowanie: (w FF, Chrome): Właściwość lastIndex wydaje się utrzymywać przez wiele kreacji RegExp.
E.g.
function foo(s) {
// A *NEW* regular expression
// is created on each call of foo():
var regex = /ABC/g;
document.write(regex.lastIndex + '<br/>');
// regex.test() updates lastIndex property
regex.test(s);
// This is where the regex's life should end...
// (Why does it persist?)
}
foo('ABC');
foo('ABCABC');
foo('ABCABCABC');
Zobacz tutaj: http://jsbin.com/otoze
Nowe RegExp przedmiot jest tworzony na każdym wywołaniu funkcji (prawda?), Więc dlaczego jest następujący pisany dokument ?? -
0
3
6
???
Uwaga, ta dziwność zdarza się w FF (3) i Chrome (2), ale, co ciekawe, nie jest to IE.
Czy to oczekiwane zachowanie, czy IE robi to źle czy nie? Czy to znany błąd?
EDYTOWANIE: nie wydaje się, aby stało się to podczas tworzenia instancji wyrażenia za pomocą konstruktora zamiast literału. Na przykład. new RegExp('ABC','g');
... Mimo to literał powinien (teoretycznie) zadziałać, prawda?
To moje przypuszczenie zbyt ... Mimo to dziwne ... – James
@JP: To naprawdę nie jest takie dziwne, nigdy nie używałeś słowa kluczowego 'new'. – Chris
Co dziwne, jeśli wywołasz ten sam kod w funkcji wiele razy, zwróci on poprawne wyjście. Wygląda na to, że nieprawidłowo optymalizuje niektóre przypisania w późniejszych połączeniach tej samej funkcji. –