Existe-t-il de toute façon de détecter si un objet JavaScript est une expression régulière?
Par exemple, je voudrais faire quelque chose comme ceci:
var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
Est-ce possible?
Merci!
EDIT: Merci pour toutes les réponses. Il semble que j'ai deux très bons choix:
obj.constructor.name === "RegExp"
ou
obj instanceof RegExp
Des avantages/inconvénients majeurs pour l'une ou l'autre méthode?
Merci encore!
Vous pouvez utiliser instanceof opérateur:
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
En fait, c'est presque la même chose que:
var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true
Gardez à l'esprit que comme RegExp n'est pas un type de données primitif , il n'est pas possible d'utiliser typeof
opérateur qui pourrait être la meilleure option pour cette question.
Mais vous pouvez utiliser cette astuce ci-dessus ou d'autres comme type de canard vérification, par exemple, vérifier si un tel objet a des méthodes ou propriétés vitales, ou par son valeur de classe interne (en utilisant {}.toString.call(instaceOfMyObject)
).
alert( Object.prototype.toString.call( t ) ); // [object RegExp]
C'est la manière mentionnée dans la spécification pour obtenir la classe d'objet.
De ECMAScript 5, Section 8.6.2 Propriétés et méthodes internes des objets:
La valeur de la propriété interne [[Class]] est définie par cette spécification pour chaque type d'objet intégré. La valeur de la propriété interne [[Class]] d'un objet Host peut être n'importe quelle valeur de chaîne à l'exception de "Arguments", "Array", "Boolean", "Date", "Error", "Function" , "JSON", "Math", "Number", "Object", "RegExp" et "String". La valeur d'une propriété interne [[Class]] est utilisée en interne pour distinguer différents types d'objets. Notez que cette spécification ne fournit aucun moyen à un programme d'accéder à cette valeur, sauf via Object.prototype.toString (voir 15.2.4.2).
Un RegExp est une classe d'objets définie dans la spécification à Section 15.10 RegExp (RegularExpression) Objects:
Un objet RegExp contient une expression régulière et les indicateurs associés.
Donner la .constructor
propriété un tourbillon:
> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
De nderscore.js
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
Fonctionne dans Google Chrome:
x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
Il n'y a aucun moyen absolu de vérifier cela, jusqu'à présent la meilleure réponse est
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
mais il y a un inconvénient à cette approche et c'est qu'elle retournera false si l'objet d'expression régulière ressemble à une autre fenêtre.
Voici deux façons:
/^\/.*\/$/.test(/hi/) /* test regexp literal via regexp literal */
/^\/.*\/$/.test(RegExp("hi") ) /* test RegExp constructor via regexp literal */
RegExp("^/" + ".*" + "/$").test(/hi/) /* test regexp literal via RegExp constructor */
RegExp("^/" + ".*" + "/$").test(RegExp("hi") ) /* test RegExp constructor via RegExp constructor */
delete RegExp("hi").source /* test via deletion of the source property */
delete /hi/.global /* test via deletion of the global property */
delete /hi/.ignoreCase /* test via deletion of the ignoreCase property */
delete RegExp("hi").multiline /* test via deletion of the multiline property */
delete RegExp("hi").lastIndex /* test via deletion of the lastIndex property */
Si un littéral de chaîne est délimité par le délimiteur de barre oblique inverse regexp, l'autotest regexp échouera.
Si Object.seal
ou Object.freeze
sont exécutées sur un objet défini par l'utilisateur, et cet objet possède également toutes les propriétés susmentionnées, l'instruction delete
renverra un faux positif.
Références
"Regexp" n'est pas un type Javascript natif. La plupart des réponses ci-dessus vous expliquent comment accomplir votre tâche, mais pas pourquoi. Voici pourquoi .