Javascript! Istanza di If Dichiarazione


186

Questa è una domanda davvero basilare solo per soddisfare la mia curiosità, ma c'è un modo per fare qualcosa del genere:

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

La chiave qui è in grado di utilizzare il NOT! davanti all'istanza. Di solito il modo in cui devo 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 else quando voglio semplicemente sapere se l'oggetto è un tipo specifico.

Risposte:


356

Racchiudere tra parentesi e negare all'esterno.

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

In questo caso, l'ordine di precedenza è importante ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Il ! l'operatore precede l'istanza dell'operatore.


9
@ hrishikeshp19 - Sono abbastanza sicuro che tu abbia bisogno delle parentesi, ho appena provato che in Chrome, IE e nodo e ogni host ne aveva bisogno.
Marco Papa,

1
@ riship89 sono richiesti i genitori, prova: !! obj instanceof Arrayrestituisce false (errato) mentre !!(obj instanceof Array)restituisce true (corretto)
zamnuts

10
Il motivo è che! Obj viene valutato per primo in if (! Obj instanceof Array), che valuta true (o false), che diventa if (bool instanceof Array), che è ovviamente falso. Pertanto, avvolgerlo tra parentesi come suggerito.
Ronnbot,

1
Questo motivo dovrebbe davvero essere parte della risposta, altrimenti questa risposta non è migliore di quella di Chris qui sotto. @SergioTulentsev, saresti così gentile e aggiungeresti qualcosa del genere: 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. alla tua risposta?
user0800

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

È il modo corretto di verificarlo - come altri hanno già risposto. Le altre due tattiche che sono state 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' instanceofoperatore. Quindi, !objvalutato per falseprimo (è equivalente a ! Boolean(obj)); quindi stai verificando se false instanceof Array, il che è ovviamente negativo.

Nel caso !dell'operatore prima instanceofdell'operatore.

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

Questo è un errore di sintassi. Operatori come !=un singolo operatore, al contrario di un NON applicato a un EQUALS. Non esiste un operatore come !instanceofnello stesso modo in cui non esiste un !<operatore.


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

5
Solo le risposte che spiegano il perché di un problema (come questo) dovrebbero essere accettate ...
Robert Rossmann,

@chrismichaelscott Secondo me, e sono sicuro di non essere solo, una risposta come la tua è la cosa più desiderata 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 che avrebbe dovuto essere la risposta accettata.
cram2208,

42

È 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
}

Provalo qui


7
In realtà sembra più pulito della negazione per me.
Kamil Latosinski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.