web-dev-qa-db-fra.com

typeof pour RegExp

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!

130
tau

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)).

173
Cleiton
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.

22
user113716

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
13
John Kugelman

De nderscore.js

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };
10
Sean Vieira

Fonctionne dans Google Chrome:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
3
werehuman

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.

0
Iman Mohamadi

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

0
Paul Sweatte

"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 .