typeof para RegExp

¿Hay alguna forma de detectar si un object JavaScript es una expresión regular?

Por ejemplo, me gustaría hacer algo como esto:

var t = /^foo(bar)?$/i; alert(typeof t); //I want this to return "regexp" 

es posible?

¡Gracias!

EDITAR: Gracias por todas las respuestas. Parece que tengo dos muy buenas opciones:

 obj.constructor.name === "RegExp" 

o

 obj instanceof RegExp 

¿Alguna ventaja / desventaja importante para cualquiera de los methods?

¡Gracias de nuevo!

Puede usar el operador instanceof :

 var t = /^foo(bar)?$/i; alert(t instanceof RegExp);//returns true 

De hecho, eso es casi lo mismo que:

 var t = /^foo(bar)?$/i; alert(t.constructor == RegExp);//returns true 

Tenga en count que como Regex no es un tipo de datos primitivo , no es posible utilizar el operador typeof , que podría ser la mejor opción para esta pregunta.

Pero puede usar este truco arriba u otros como la verificación de tipo de pato , por ejemplo, verificando si dicho object tiene algún método o properties vitales, o por su valor de class interno (usando {}.toString.call(instaceOfMyObject) ).

 alert( Object.prototype.toString.call( t ) ); // [object RegExp] 

Esta es la forma mencionada en la especificación para get la class de object.

De ECMAScript 5, Sección 8.6.2 Propiedades y methods internos del object :

El valor de la propiedad interna [[Class]] se define en esta especificación para cada class de object incorporado. El valor de la propiedad interna [[Class]] de un object host puede ser cualquier valor String excepto uno de "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON" , "Matemáticas", "Número", "Objeto", "RegExp" y "Cadena" . El valor de una propiedad interna [[Class]] se usa internamente para distinguir diferentes types de objects. Tenga en count que esta especificación no proporciona ningún medio para que un progtwig acceda a ese valor, excepto a través de Object.prototype.toString (consulte 15.2.4.2).

Un RegExp es una class de object definido en la especificación en la Sección 15.10 Objetos RegExp (RegularExpression) :

Un object RegExp contiene una expresión regular y los indicadores asociados.

Dale a la propiedad .constructor un giro:

 > /^foo(bar)?$/i.constructor function RegExp() { [native code] } > /^foo(bar)?$/i.constructor.name "RegExp" > /^foo(bar)?$/i.constructor == RegExp true 

De underscore.js

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

Funciona en google chrome:

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

"Regexp" no es un tipo de Javascript nativo. La mayoría de las respuestas anteriores te dicen cómo llevar a cabo tu tarea, pero no por qué. He aquí por qué .

No hay una forma absoluta de verificar esto, hasta ahora la mejor respuesta es

 var t = /^foo(bar)?$/i; alert(t instanceof RegExp);//returns true 

pero hay una desventaja en este enfoque y es que devolverá falso si el object de expresión regular está sonando desde otra window.

Aquí hay dos maneras:

 /^\/.*\/$/.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 literal de cadena está delimitado por el delimitador de barra diagonal inversa de expresión regular, la autotesting de expresión regular fallará.

Si Object.seal u Object.freeze se ejecutan en un object definido por el usuario, y ese object también tiene todas las properties mencionadas anteriormente, la instrucción delete devolverá un falso positivo.

Referencias

  • ECMAScript 5, Sección 15.10.4.1 nuevo RegExp (patrón, banderas)

  • ¿Cuáles son algunos casos de uso de cuando delete ha sido muy útil en JavaScript?

  • ¿Por qué esta propiedad configurable no es eliminable?

  • Webkit JavaScriptCore fuente: ObjectConstructor.cpp

  • Propiedades del object en JavaScript