2009-08-25 9 views
1

Les résultats de code suivant dans pour lastIndex "undefined":Un problème regex bizarre

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 

document.write(r.lastIndex); 

Cependant, il fonctionne parfaitement pour r.index (et r.input).

J'utilise Firefox. Est-ce que quelqu'un a une idée?

EDIT: OK, le code ci-dessus fonctionne parfaitement dans IE! De plus, dans Firefox, cela fonctionne parfaitement si au lieu d'appeler r.lastIndex sur la ligne 5, un a.lastIndex est appelé. Il semble que Firefox ne renvoie pas la propriété lastIndex dans le résultat - il définit plutôt la propriété pour le modèle appelant le exec() uniquement. Intéressant que IE définit les deux.

Répondre

4

C'est l'un de ces endroits où Microsoft a décidé d'ajouter des choses à la langue et d'agir comme si elle était censé être là. Heureusement, ils nettoient maintenant leur acte et documentent de telles absurdités. Pour être clair: Firefox est correct selon le ECMAScript Language Specification 3rd Edition (PDF, 705KB).

IE est et non correct; son comportement est une extension propriétaire. Il n'y a aucune raison de croire que ce comportement spécifique à IE sera jamais supporté par un autre navigateur. Ce n'est certainement pas pour le moment. Voir JScript Deviations from ES3 (PDF, 580 Ko, par Pratap Lakshman de Microsoft Corporation) Section 4.6 pour plus sur cet écart particulier de la spécification, y compris les tests ne montrant aucun soutien sur les autres navigateurs. Notez également que IE ne supportera peut-être même pas cela à l'avenir: un certain nombre de mécanismes propriétaires IE CSS sont désactivés par défaut en mode IE8-in-IE8, et les futures implémentations de JScript peuvent trouver une raison pour désactiver de même cette extension à la langue.

4

lastIndex est une propriété d'un RegExp object. Donc, essayez ceci:

a.lastIndex 
+0

lastIndex est également une propriété du résultat retourné par exec() ainsi qu'une propriété du motif invoquer exec() –

+0

@Crimson: Non, 'lastIndex' n'est pas une propriété de la valeur de retour de' exec': 'r.hasOwnProperty (" lastIndex ")' renvoie * false *. Voir aussi https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec#Description – Gumbo

0

Pour éviter tout bizarre, essayez ce

var a = /cat/g; 
var l = "A test sentence containing cat and dog."; 
var r = a.exec(l); 
var lastIndex = (r!=null) ? l.indexOf(r[0])+r[0].length : 0; 

Il est utilisé ici: http://www.pagecolumn.com/tool/regtest.htm