2009-10-07 7 views
5

Je sais qu'il y a quelques discordances regex/lastIndex mais celui-ci est nouveau pour moi!Regex/lastIndex - Comportement inattendu

Comportement attendu: Création d'une nouvelle expression régulière (avec littérale/constructeur) sera, de toute évidence, créer un nouvel objet RegExp avec une propriété lastIndex à zéro.

Comportement réel: (dans FF, Chrome): La propriété lastIndex semble persister à travers plusieurs créations 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'); 

Voir ici: http://jsbin.com/otoze


Un nouvel objet RegExp est en cours de création sur chaque appel de fonction (à droite?), Alors pourquoi est ce qui suit en cours d'écriture sur le document ?? -

0 
3 
6 

??? Notez, cette bizarrerie semble se produire dans FF (3) et Chrome (2), mais, curieusement, pas d'Internet Explorer.

Est-ce que ce comportement est attendu, IE se trompe-t-il ou non? Est-ce un bug bien connu?


EDIT: cela ne semble pas se produire lors de l'instanciation regex avec un constructeur au lieu d'un littéral. Par exemple. ... Pourtant, le littéral devrait (théoriquement) fonctionner, n'est-ce pas?

Répondre

5

var regex = new RegExp("ABC", "g"); n'a pas ce problème, donc je suppose que /ABC/g réutilise les objets regexp.

EDIT: Apparemment, ce comportement est correct selon la spécification ECMAScript 3.0, il est fixé dans ECMAScript 3,1 à details

+0

C'est ma conjecture aussi ... Encore bizarre ... – James

+0

@JP: Ce n'est pas vraiment bizarre, vous n'avez jamais utilisé le mot clé 'new'. – Chris

+0

Ce qui est étrange, c'est que si vous appelez le même code dans la fonction plusieurs fois, il retournera la bonne sortie. Il semble presque qu'il optimise incorrectement certaines affectations dans les appels ultérieurs de la même fonction. –

1

Essayez ceci:

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'); 
Questions connexes