2012-01-16 19 views
107

Ésta es una pregunta muy básica en realidad sólo para satisfacer mi curiosidad, pero hay una manera de hacer algo como esto:Javascript instanceof Si Declaración

if(obj !instanceof Array) { 
    //The object is not an instance of Array 
} else { 
    //The object is an instance of Array 
} 

La clave aquí es capaz de utilizar el NO! frente a instancia. Por lo general, la forma en que tengo que configurar esto es así:

if(obj instanceof Array) { 
    //Do nothing here 
} else { 
    //The object is not an instance of Array 
    //Perform actions! 
} 

Y es un poco molesto tener que crear una sentencia else cuando yo simplemente quiero saber si el objeto es un tipo específico.

Respuesta

236

Se encierra entre paréntesis y se niega en el exterior.

if(!(obj instanceof Array)) { 
    //... 
} 
+8

@ hrishikeshp19 - I Estoy bastante seguro de que necesitas los parens, lo intenté en Chrome, IE y nodo, y cada host los necesitaba. –

+0

@ riship89 se requieren parens, prueba: '' !! obj instanceof Array'' devuelve falso (incorrecto) mientras '' !! (obj instanceof Array) '' devuelve verdadero (correcto) – zamnuts

+8

La razón es que! obj se evalúa primero en if (! obj instanceof Array), que se evalúa como true (o false), que luego se convierte en if (bool instanceof Array), que obviamente es falso. Por lo tanto, envuélvalo entre paréntesis como se sugiere. – ronnbot

57
if (!(obj instanceof Array)) { 
    // do something 
} 

es la forma correcta para comprobar esto - como ya se ha contestado. Las otras dos tácticas que se han sugerido no funcionarán y deben entenderse ...

En el caso del operador ! sin soportes.

if (!obj instanceof Array) { 
    // do something 
} 

En este caso, el orden de precedencia es importante (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). El operador ! precede al operador instanceof. Por lo tanto, !obj evaluado a false primero (es equivalente a ! Boolean(obj)); entonces usted está probando si false instanceof Array, que es obviamente negativo.

En el caso del operador ! antes del operador instanceof.

if (obj !instanceof Array) { 
    // do something 
} 

Este es un error de sintaxis. Los operadores como != son un solo operador, a diferencia de NO aplicado a un EQUAL. No existe un operador como !instanceof de la misma manera que no hay un operador !<.

+0

NB. Habría hecho un comentario sobre la respuesta de Sergio, ya que obviamente es correcto, pero yo no era miembro de SO, así que no tenía suficientes puntos de reputación para comentar. – chrismichaelscott

+4

Solo las respuestas que expliquen el ** por qué ** de un problema (como este) deberían ser aceptadas ... –

+0

@chrismichaelscott En mi opinión, y estoy seguro de que no estoy solo, una respuesta como la tuya es la más buscada por cualquiera haciendo una pregunta aquí.Está claro, al punto, y comparte suficiente información y ejemplos para sortear el problema presentado. Muchas gracias. Y creo que mereces la reputación y debería haber sido la respuesta aceptada. – cram2208

18

Es fácil olvidar los paréntesis (paréntesis) para que pueda hacer un hábito de hacer:

if(obj instanceof Array === false) { 
    //The object is not an instance of Array 
} 

o

if(false === obj instanceof Array) { 
    //The object is not an instance of Array 
} 

Pruébalo here

+0

En realidad se ve más limpio que la negación para mí. –