2012-01-16 9 views
107

To jest naprawdę podstawowe pytanie naprawdę tylko zaspokoić moją ciekawość, ale czy istnieje sposób, aby zrobić coś takiego:JavaScript instanceof if

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

Kluczem tutaj jest w stanie używać NIE! przed instancją. Zazwyczaj sposób muszę skonfigurować to jest tak:

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

i jest to trochę irytujące, aby stworzyć oświadczenie innego kiedy ja po prostu chcę wiedzieć, czy obiekt jest specyficzny typ.

Odpowiedz

236

Umieścić w nawiasach i zanegować na zewnątrz.

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

@ hrishikeshp19 - I Jestem pewien, że potrzebujesz parens, po prostu wypróbowałem to w chrome, IE i node, a każdy host ich potrzebował. –

+0

@ riship89 parens są wymagane, dowód: '' !! obj instanceof Array'' zwraca false (niepoprawne), podczas gdy '' !! (obj instanceof Array) 'zwraca true (correct) – zamnuts

+8

Powodem jest to, że! obiekt jest oceniany jako pierwszy jeśli (! obj instanceof Array), który ocenia true (lub false), które następnie staje się jeśli (bool instanceof Array), co jest oczywiście fałszywe. Dlatego zawiń go w nawias, zgodnie z sugestią. – ronnbot

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

jest poprawny sposób, aby sprawdzić, to - jak inni już odpowiedział. Pozostałe dwie taktyki, które zostały zasugerowane, nie będą działać i należy je rozumieć ...

W przypadku operatora ! bez nawiasów.

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

W takim przypadku ważna jest kolejność pierwszeństwa (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). Operator ! poprzedza operatora instanceof. Tak więc, !obj oszacowano najpierw jako false (jest to odpowiednik ! Boolean(obj)); następnie testujesz, czy false instanceof Array, co oczywiście jest negatywne.

W przypadku operatora ! przed operatorem instanceof.

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

To jest błąd w składni. Operatory, takie jak !=, są pojedynczym operatorem, w przeciwieństwie do NIE stosowanego do EQUALS. Nie ma takiego operatora, jak !instanceof w taki sam sposób, jak nie ma operatora !<.

+0

NB. Zrobiłbym to komentarz do odpowiedzi Sergio, ponieważ jest to oczywiście poprawne, ale nie byłem członkiem SO, więc nie miałem wystarczająco dużo punktów reputacji, aby to skomentować. – chrismichaelscott

+4

Tylko odpowiedzi wyjaśniające ** dlaczego ** problemu (takiego jak ten) powinny zostać zaakceptowane ... –

+0

@chrismichaelscott Moim zdaniem, i jestem pewien, że nie jestem sam, odpowiedź taka jak Twoja jest tym, co najbardziej pożądane przez ktoś pyta tutaj.Jest oczywiste, i podziela wystarczające informacje i przykłady, aby omówić problem. Wielkie dzięki. I myślę, że zasługujesz na reputację i powinna być ona zaakceptowaną odpowiedzią. – cram2208

18

Łatwo jest zapomnieć nawiasie (wsporniki), aby można było w zwyczaju robić:

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 go here

+0

Wygląda na czystsze niż negacja. –