2009-10-07 16 views
5

Sé que hay algunas discrepancias regex/lastIndex pero esta es nueva para mí.Regex/lastIndex - Comportamiento inesperado

comportamiento esperado: Creación de una nueva expresión regular (con literal/constructor) será, obviamente, crear un nuevo objeto RegExp con una propiedad lastIndex puesto a cero.

Comportamiento real: (en FF, Chrome): La propiedad lastIndex parece persistir a través de múltiples creaciones 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'); 

Ver aquí: http://jsbin.com/otoze


Un nuevo objeto RegExp se está creando en cada función de llamada (¿verdad?), ¿Por qué es la siguiente están escribiendo en el documento ?? -

0 
3 
6 

???

Nota, esta rareza parece ocurrir en FF (3) y Chrome (2), pero, curiosamente no en IE.

¿Es este comportamiento esperado, IE lo entiende mal o no? ¿Es este un error conocido?


EDIT: esto no parece que ocurra cuando una instancia de la expresión regular con un constructor en lugar de un literal. P.ej. new RegExp('ABC','g'); ... Sin embargo, el literal debería (teóricamente) funcionar, ¿no?

Respuesta

5

var regex = new RegExp("ABC", "g"); no tiene ese problema, así que supongo que /ABC/g reutiliza los objetos regexp.

EDIT: Al parecer, este es el comportamiento correcto de acuerdo a la especificación ECMAScript 3.0, que está fijado en ECMAScript 3,1-details

+0

Esa es mi conjetura también ... Todavía extraño ... – James

+0

@JP: No es tan extraño, nunca usaste la palabra clave 'new'. – Chris

+0

Lo extraño es que si llamas varias veces al mismo código en la función, devolverá la salida correcta. Casi parece que optimiza incorrectamente algunas asignaciones en llamadas posteriores de la misma función. –

1

Prueba esto:

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'); 
Cuestiones relacionadas