typeof pour les RegExp
y a-t-il de toute façon pour détecter si un objet JavaScript est un regex?
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
Toute les principaux avantages/inconvénients de chaque méthode?
Merci encore!
8 réponses
Vous pouvez utiliser instanceof opérateur:
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
en fait, c'est-à-dire presque le même que:
var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true
gardez à l'esprit que comme Regex n'est pas un type de données primitives , il n'est pas possible d'utiliser typeof
opérateur qui pourrait être la meilleure option pour cette question.
mais vous pouvez utilisez cette astuce ci-dessus ou d'autres comme type de canard vérifier , par exemple, vérifier si un tel objet a des méthodes ou des 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 façon mentionnée dans la spécification pour obtenir la classe de l'objet.
à Partir de ECMAScript 5, de l'Article 8.6.2 de l'Objet Interne Propriétés et Méthodes :
la valeur de La [[Catégorie]] propriété interne est défini par cette spécification pour chaque type d'objet intégré. La valeur de la propriété interne [[Class]] d'un objet hôte peut être n'importe quelle valeur de chaîne de caractères sauf une valeur de "Arguments", "Tableau", "Boolean", "Date", "Erreur", "Fonction", "JSON", "Mathématiques", "Nombre", "Objet", "RegExp", et la "Chaîne de caractères" . La valeur d'une [[classe]] propriété interne est utilisée à l'interne pour distinguer différents types d'objets. Notez que cette spécification ne fournit aucun moyen pour un programme d'accéder à cette valeur sauf par objet.prototype.toString (voir 15.2.4.2).
un RegExp est une classe d'objet définie dans la spécification Section 15.10 RegExp(RegularExpression)Objets :
un objet RegExp contient une expression régulière et les drapeaux associés.
Donner .constructor
la propriété d'un bain:
> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
à Partir de trait de soulignement.js
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
Travaille dans google chrome:
x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false
"Regexp" n'est pas un natif Javascript type. La plupart des réponses ci-dessus, vous dire comment accomplir votre tâche, mais pourquoi pas. Voici pourquoi .
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 côté vers le bas à cette approche et c'est qu'elle retournera false si l'objet d'expression régulière est commeing d'une autre fenêtre.
il y a 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 une chaîne littérale est délimitée par le délimiteur regexp backslash, le test regexp self échouera.
si Object.seal
ou Object.freeze
sont exécutés sur un objet défini par l'utilisateur, et que cet objet possède également toutes les propriétés susmentionnées, la déclaration delete
retournera un faux positif.
Références