2009-10-07 17 views
5

So che ci sono alcune regex/lastIndex discrepanze ma questo è nuovo per me!Regex/lastIndex - Comportamento imprevisto

comportamento previsto: Creazione di una nuova espressione regolare (con letterale/costruttore) sarà, ovviamente, creare un nuovo oggetto RegExp con una proprietà lastIndex impostato a zero.

Comportamento effettivo: (in FF, Chrome): la proprietà lastIndex sembra persistere attraverso più creazioni 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'); 

vedere qui: http://jsbin.com/otoze


Un nuovo oggetto RegExp è essere creato su ogni chiamata di funzione (di destra?), Quindi perché è la seguente fase di scrittura del documento ?? -

0 
3 
6 

???

Nota, questa stranezza sembra accadere in FF (3) e Chrome (2), ma, curiosamente, non in IE.

È questo comportamento previsto, IE ha sbagliato o giusto? È un bug noto?


EDIT: questo non sembra accadere quando istanziare la regex con un costruttore, invece di un letterale. Per esempio. new RegExp('ABC','g'); ... Tuttavia, il letterale dovrebbe (teoricamente) funzionare, giusto?

risposta

5

var regex = new RegExp("ABC", "g"); non ha questo problema, quindi suppongo che /ABC/g riutilizzi oggetti regexp.

EDIT: A quanto pare questo è corretto comportamento in base alle specifiche ECMAScript 3.0, è fissato in ECMAScript 3,1-details

+0

Questa è la mia ipotesi troppo ... Ancora strano ... – James

+0

@ JP: Non è poi così strano, non hai mai usato la parola chiave 'new'. – Chris

+0

Ciò che è strano è che se si chiama lo stesso codice nella funzione più volte, verrà restituito l'output corretto. Sembra quasi che ottimizzi erroneamente alcuni incarichi in chiamate successive della stessa funzione. –

1

Prova questo:

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'); 
Problemi correlati