2012-01-16 12 views
107

Questa è una domanda veramente di base in realtà solo per soddisfare la mia curiosità, ma c'è un modo per fare qualcosa di simile:Javascript instanceof if

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

La chiave qui essere in grado di utilizzare il NOT! di fronte ad esempio. Di solito il modo che ho per impostare questo è come questo:

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

Ed è un po 'fastidioso dover creare un'istruzione altro quando ho semplicemente voglio sapere se l'oggetto è un tipo specifico.

risposta

236

Racchiudere tra parentesi e negare all'esterno.

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

@ hrishikeshp19 - I Sono abbastanza sicuro di aver bisogno del paren, l'ho appena provato in chrome, IE e node e ogni host aveva bisogno di loro. –

+0

@ riship89 parenti sono obbligatori, prova: '' !! obj instanceof Array'' restituisce false (errato) mentre '' !! (obj instanceof Array) '' restituisce true (corretto) – zamnuts

+8

Il motivo è che! obj viene valutato per primo se (! obj instanceof Array), che valuta come vero (o falso), che diventa quindi se (bool instanceof Array), che è ovviamente falso. Pertanto, avvolgerlo tra parentesi come suggerito. – ronnbot

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

è il modo corretto per verificare la presenza di questo - come altri hanno già risposto. Le altre due tattiche suggerite non funzioneranno e dovrebbero essere comprese ...

Nel caso dell'operatore ! senza parentesi.

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

In questo caso, l'ordine di precedenza è importante (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). L'operatore ! precede l'operatore instanceof. Quindi, !obj valutato prima a false (è equivalente a ! Boolean(obj)); quindi stai testando se false instanceof Array, che è ovviamente negativo.

Nel caso dell'operatore ! prima dell'operatore instanceof.

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

Questo è un errore di sintassi. Operatori come != sono un operatore singolo, a differenza di un NON applicato a un EQUALS. Non esiste un operatore come !instanceof allo stesso modo in cui non esiste un operatore !<.

+0

NB. Avrei fatto un commento sulla risposta di Sergio, che ovviamente era corretto, ma non ero un membro di SO, quindi non avevo abbastanza punti reputazione da commentare. – chrismichaelscott

+4

Solo le risposte che spiegano il ** perché ** di un problema (come questo) dovrebbero essere accettate ... –

+0

@chrismichaelscott A mio parere, e sono sicuro di non essere solo, una risposta come la tua è la cosa più ricercata da chiunque faccia una domanda qui.È chiaro, al punto, e condivide abbastanza informazioni ed esempi per aggirare il problema presentato. Molte grazie. E penso che tu meriti la reputazione e avrebbe dovuto essere la risposta accettata. – cram2208

18

E 'facile dimenticare la parentesi (parentesi) in modo da poter prendere l'abitudine di fare:

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 
} 

Prova ora here

+0

Sembra davvero più pulito della negazione per me. –

Problemi correlati