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
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?
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
// 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.