2009-10-07 22 views
5

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?

Odpowiedz

5

var regex = new RegExp("ABC", "g"); nie ma tego problemu, więc domyślam się, że /ABC/g ponownie używa obiektów regexp.

EDIT: Najwyraźniej jest to poprawne zachowanie według specyfikacji ECMAScript 3.0, to ustalone w ECMAScript 3.1 - details

+0

To moje przypuszczenie zbyt ... Mimo to dziwne ... – James

+0

@JP: To naprawdę nie jest takie dziwne, nigdy nie używałeś słowa kluczowego 'new'. – Chris

+0

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. –

1

Spróbuj tego:

function foo(s) { 

    // A *NEW* regular expression 
    // is created on each call of foo(): 
    var regex = new 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'); 
Powiązane problemy