variable type node know how array javascript regex constructor instanceof typeof

node - typeof date javascript



typeof para RegExp (8)

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

¿Hay alguna forma de detectar si un objeto 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 métodos?

¡Gracias de nuevo!


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 autoprueba de expresión regular fallará.

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

Referencias


Dale un .constructor propiedad .constructor :

> /^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


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 objeto de expresión regular está sonando desde otra ventana.


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 cuenta 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 objeto tiene algún método o propiedades vitales, o por su valor de clase interno (usando {}.toString.call(instaceOfMyObject) ).


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

Esta es la forma mencionada en la especificación para obtener la clase de objeto.

De ECMAScript 5, Sección 8.6.2 Propiedades y métodos internos del objeto :

El valor de la propiedad interna [[Class]] se define en esta especificación para cada clase de objeto incorporado. El valor de la propiedad interna [[Class]] de un objeto 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 tipos de objetos. Tenga en cuenta que esta especificación no proporciona ningún medio para que un programa acceda a ese valor, excepto a través de Object.prototype.toString (consulte 15.2.4.2).

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

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