Declaración de Javascript! Instanceof If

186

Esta es una pregunta realmente básica para satisfacer mi curiosidad, pero hay una manera de hacer algo como esto:

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

¡La clave aquí es poder usar el NOT! delante de la 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 declaración else cuando simplemente quiero saber si el objeto es de un tipo específico.

ryandlf
fuente

Respuestas:

356

Encerrar entre paréntesis y negar en el exterior.

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

En este caso, el orden de precedencia es importante ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Los ! operador precede a la instancia de operador.

Sergio Tulentsev
fuente
9
@ hrishikeshp19 - Estoy bastante seguro de que necesitas los parens, solo intenté eso en Chrome, IE y nodo y cada host los necesitaba.
Marcus Pope el
1
@ riship89 se requieren parens, prueba: !! obj instanceof Arraydevuelve falso (incorrecto) mientras !!(obj instanceof Array)devuelve verdadero (correcto)
zamnuts
10
La razón es que! Obj se evalúa primero en if (! Obj instanceof Array), que se evalúa como verdadero (o falso), 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
1
Esta razón realmente debería ser parte de la respuesta, de lo contrario, esta respuesta no es mejor que la de Chris a continuación. @SergioTulentsev, ¿sería tan amable y agregaría algo como esto: In this case, the order of precedence is important (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). The ! operator precedes the instanceof operator. a su respuesta?
user0800
73
if (!(obj instanceof Array)) {
    // do something
}

Es la forma correcta de verificar esto, ya que otros ya han respondido. Las otras dos tácticas sugeridas no funcionarán y deben entenderse ...

En el caso del !operador sin corchetes.

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 instanceofoperador. Entonces, !objevaluado a falseprimero (es equivalente a ! Boolean(obj)); entonces estás probando si false instanceof Array, lo que obviamente es negativo.

En el caso del !operador antes que el instanceofoperador.

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

Este es un error de sintaxis. Operadores como !=son un solo operador, a diferencia de un NO aplicado a un EQUALS. No existe tal operador como !instanceofde la misma manera que no hay !<operador.

chrismichaelscott
fuente
NÓTESE BIEN. Hubiera hecho un comentario sobre la respuesta de Sergio, ya que obviamente es correcto, pero no era miembro de SO, así que no tenía suficientes puntos de reputación para comentar.
chrismichaelscott
55
Solo las respuestas que explican el por qué de un problema (como este) deberían ser aceptadas ...
Robert Rossmann
@chrismichaelscott En mi opinión, y estoy seguro de que no estoy solo, una respuesta como la suya es lo que más desea alguien que haga una pregunta aquí. Es claro, al punto, y comparte suficiente información y ejemplos para evitar el problema presentado. Muchas gracias. Y creo que mereces la reputación y debería haber sido la respuesta aceptada.
cram2208
42

Es fácil olvidar el paréntesis (paréntesis) para que pueda hacer el 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 aquí

Marchitar
fuente
77
En realidad, se ve más limpio que la negación para mí.
Kamil Latosinski