JavaScript! Instanceof If Instrukcja

186

To jest naprawdę podstawowe pytanie, aby zaspokoić moją ciekawość, ale czy istnieje sposób na zrobienie czegoś takiego:

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

Kluczem tutaj jest możliwość korzystania z NOT! przed instancją. Zazwyczaj muszę to skonfigurować w następujący sposób:

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

I trochę denerwujące jest tworzenie instrukcji else, gdy chcę po prostu wiedzieć, czy obiekt jest określonego typu.

ryandlf
źródło

Odpowiedzi:

356

Dołącz w nawiasach i neguj na zewnątrz.

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

W takim przypadku kolejność pierwszeństwa jest ważna ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). The! operator poprzedza operator instanceof.

Sergio Tulentsev
źródło
9
@ hrishikeshp19 - Jestem prawie pewien, że potrzebujesz parens, właśnie próbowałem tego w chrome, IE i węźle i każdy host ich potrzebował.
Marcus Pope
1
@ riship89 parens są wymagane, dowód: !! obj instanceof Arrayzwraca false (niepoprawny), a !!(obj instanceof Array)zwraca true (poprawny)
zamnuts,
10
Wynika to z tego, że! Obj jest najpierw oceniany w if (! Obj instanceof Array), co daje wartość true (lub false), która następnie staje się if (bool instanceof Array), co oczywiście jest fałszem. Dlatego zawiń go w nawiasy, zgodnie z sugestią.
ronnbot
1
Ten powód powinien naprawdę być częścią odpowiedzi, w przeciwnym razie ta odpowiedź nie będzie lepsza niż ta z Chrisa poniżej. @SergioTulentsev, czy byłbyś tak miły i dodałbyś coś takiego: 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. do swojej odpowiedzi?
user0800 18.01.19
73
if (!(obj instanceof Array)) {
    // do something
}

To właściwy sposób, aby to sprawdzić - jak już inni odpowiedzieli. Pozostałe dwie taktyki, które zostały zasugerowane, nie będą działać i należy je zrozumieć ...

W przypadku !operatora bez wsporników.

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

W takim przypadku kolejność pierwszeństwa jest ważna ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). !Operatora poprzedza instanceofoperatora. Tak więc, !objoceniane jako falsepierwsze (jest to równoważne z ! Boolean(obj)); następnie testujesz, czy false instanceof Array, co jest oczywiście negatywne.

W przypadku !operatora przed instanceofoperatorem.

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

To jest błąd składniowy. Operatory takie jak !=pojedynczy operator, w przeciwieństwie do NOT stosowanej do EQUALS. Nie ma takiego operatora, jak !instanceofw przypadku braku !<operatora.

chrismichaelscott
źródło
NB Zrobiłbym to jako komentarz do odpowiedzi Sergio, ponieważ jest to oczywiście poprawne, ale nie byłem członkiem SO, więc nie miałem wystarczającej liczby punktów reputacji do skomentowania.
chrismichaelscott
5
Tylko odpowiedzi wyjaśniające, dlaczego problem (taki jak ten) powinien zostać zaakceptowany ...
Robert Rossmann
@chrismichaelscott Moim zdaniem i jestem pewien, że nie jestem sam, odpowiedź taka jak twoja jest tym, czego najbardziej pragnie ktoś zadający pytanie tutaj. Jest jasne, do rzeczy, i dzieli się wystarczającymi informacjami i przykładami, aby obejść przedstawiony problem. Wielkie dzięki. I myślę, że zasługujesz na reputację i powinnaś być zaakceptowaną odpowiedzią.
cram2208
42

Łatwo zapomnieć o nawiasach (nawiasach kwadratowych), dzięki czemu możesz nawykć:

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

lub

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

Wypróbuj tutaj

Więdnąć
źródło
7
Dla mnie wygląda to na czystsze niż negacja.
Kamil Latosinski