Instruction Javascript! Instanceof If


186

C'est une question vraiment basique juste pour satisfaire ma curiosité, mais y a-t-il un moyen de faire quelque chose comme ça:

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

La clé ici de pouvoir utiliser le NOT! devant l'instance. Habituellement, la façon dont je dois configurer cela est comme ceci:

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

Et c'est un peu ennuyeux d'avoir à créer une instruction else quand je veux simplement savoir si l'objet est d'un type spécifique.

Réponses:


356

Mettez entre parenthèses et annulez à l'extérieur.

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

Dans ce cas, l'ordre de priorité est important ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Le ! L'opérateur précède l'opérateur instanceof.


9
@ hrishikeshp19 - Je suis sûr que vous avez besoin des parens, je viens de l'essayer dans Chrome, IE et node et chaque hôte en avait besoin.
Marcus Pope

1
@ riship89 parens sont requis, preuve: !! obj instanceof Arrayrenvoie faux (incorrect) tandis que !!(obj instanceof Array)retourne vrai (correct)
zamnuts

10
La raison en est que! Obj est d'abord évalué dans if (! Obj instanceof Array), qui prend la valeur true (ou false), qui devient alors if (bool instanceof Array), ce qui est évidemment faux. Par conséquent, placez-le entre parenthèses comme suggéré.
ronnbot

1
Cette raison devrait vraiment faire partie de la réponse, sinon cette réponse n'est pas meilleure que celle de Chris ci-dessous. @SergioTulentsev, seriez-vous si gentil et ajoutez quelque chose comme ceci: 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. à votre réponse?
user0800

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

Est-ce la bonne façon de vérifier cela - car d'autres ont déjà répondu. Les deux autres tactiques qui ont été suggérées ne fonctionneront pas et doivent être comprises ...

Dans le cas de l' !opérateur sans parenthèses.

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

Dans ce cas, l'ordre de priorité est important ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). L' !opérateur précède l' instanceofopérateur. Donc, !objévalué en falsepremier (c'est équivalent à ! Boolean(obj)); alors vous testez si false instanceof Array, ce qui est évidemment négatif.

Dans le cas de l' !opérateur avant l' instanceofopérateur.

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

Ceci est une erreur de syntaxe. Les opérateurs tels que !=sont un opérateur unique, par opposition à un NOT appliqué à un EQUALS. Il n'y a pas d'opérateur de !instanceofla même manière qu'il n'y a pas d' !<opérateur.


NB. J'aurais fait un commentaire sur la réponse de Sergio car c'est évidemment correct, mais je n'étais pas membre de SO donc je n'avais pas assez de points de réputation pour commenter.
chrismichaelscott

5
Seules les réponses qui expliquent le pourquoi d'un problème (comme celui-ci) devraient être acceptées ...
Robert Rossmann

@chrismichaelscott À mon avis, et je suis sûr que je ne suis pas seul, une réponse comme la vôtre est ce qui est le plus recherché par quiconque pose une question ici. Il est clair, pertinent et partage suffisamment d'informations et d'exemples pour faire le tour du problème présenté. Merci beaucoup. Et je pense que vous méritez la réputation et que vous auriez dû être la réponse acceptée.
cram2208

42

Il est facile d'oublier les parenthèses (crochets) pour pouvoir prendre l'habitude de faire:

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

ou

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

Essayez-le ici


7
Cela me semble en fait plus propre que la négation.
Kamil Latosinski
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.