Javascript! Instanz der If-Anweisung

186

Dies ist eine wirklich grundlegende Frage, um meine Neugier zu befriedigen, aber gibt es eine Möglichkeit, so etwas zu tun:

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

Der Schlüssel hier ist, das NOT! vor der Instanz. Normalerweise muss ich das so einstellen:

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

Und es ist ein wenig ärgerlich, eine else-Anweisung erstellen zu müssen, wenn ich einfach wissen möchte, ob das Objekt ein bestimmter Typ ist.

ryandlf
quelle

Antworten:

354

In Klammern setzen und außen negieren.

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

In diesem Fall ist die Rangfolge wichtig ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Das ! Der Operator steht vor der Instanz des Operators.

Sergio Tulentsev
quelle
9
@ hrishikeshp19 - Ich bin mir ziemlich sicher, dass du die Parens brauchst. Ich habe es gerade in Chrome, IE und Node versucht und jeder Host brauchte sie.
Marcus Pope
1
@ riship89 parens sind erforderlich, Beweis: !! obj instanceof Arraygibt false (falsch) zurück, während !!(obj instanceof Array)true (korrekt) zurückgegeben wird
zamnuts
10
Der Grund dafür ist, dass! Obj zuerst in if (! Obj instanceof Array) ausgewertet wird, was als true (oder false) ausgewertet wird, was dann zu if (bool instanceof Array) wird, was offensichtlich false ist. Wickeln Sie es daher wie vorgeschlagen in Klammern ein.
Ronnbot
1
Dieser Grund sollte wirklich Teil der Antwort sein, sonst ist diese Antwort nicht besser als die von Chris unten. @SergioTulentsev, wären Sie so nett und würden 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. Ihrer Antwort so etwas hinzufügen ?
user0800
73
if (!(obj instanceof Array)) {
    // do something
}

Ist der richtige Weg, dies zu überprüfen - wie andere bereits geantwortet haben. Die beiden anderen vorgeschlagenen Taktiken funktionieren nicht und sollten verstanden werden ...

Im Falle des !Bedieners ohne Klammern.

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

In diesem Fall ist die Rangfolge wichtig ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Der !Operator steht vor dem instanceofOperator. Also zuerst !objbewertet false(es ist äquivalent zu ! Boolean(obj)); dann testest du ob false instanceof Arraydas was offensichtlich negativ ist.

Im Falle des !Bedieners vor dem instanceofBediener.

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

Dies ist ein Syntaxfehler. Operatoren wie !=ein einzelner Operator im Gegensatz zu einem NICHT auf EQUALS angewendeten Operator. Es gibt keinen solchen Operator !instanceofwie es keinen !<Operator gibt.

chrismichaelscott
quelle
NB. Ich hätte dies zu einem Kommentar zu Sergios Antwort gemacht, da dies offensichtlich richtig ist, aber ich war kein Mitglied von SO und hatte daher nicht genügend Reputationspunkte, um einen Kommentar abzugeben.
Chrismichaelscott
5
Nur Antworten, die das Warum eines Problems erklären (wie dieses), sollten akzeptiert werden ...
Robert Rossmann
@chrismichaelscott Meiner Meinung nach und ich bin sicher, dass ich nicht allein bin, ist eine Antwort wie Ihre das, was am meisten von jemandem gewünscht wird, der hier eine Frage stellt. Es ist klar, auf den Punkt gebracht und teilt genügend Informationen und Beispiele, um das vorgestellte Problem zu umgehen. Vielen Dank. Und ich denke, Sie verdienen den Ruf und hätten die akzeptierte Antwort sein sollen.
Cram2208
42

Es ist leicht, die Klammern (Klammern) zu vergessen, damit Sie es sich zur Gewohnheit machen können:

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

oder

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

Probieren Sie es hier aus

Verwelken
quelle
7
Für mich sieht es tatsächlich sauberer aus als Negation.
Kamil Latosinski