Javascript! Instanceof If Statement

186

Esta é uma pergunta realmente básica, apenas para satisfazer minha curiosidade, mas existe uma maneira de fazer algo assim:

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

A chave aqui é capaz de usar o NOT! na frente da instância. Normalmente, a maneira como tenho que configurar isso é assim:

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

E é um pouco chato ter que criar uma declaração else quando eu simplesmente quero saber se o objeto é um tipo específico.

ryandlf
fonte

Respostas:

356

Coloque entre parênteses e negue por fora.

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

Nesse caso, a ordem de precedência é importante ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). O ! O operador precede a instanceof operator.

Sergio Tulentsev
fonte
9
@ hrishikeshp19 - Tenho certeza de que você precisa dos parâmetros, tentei isso no chrome, IE e node e cada host precisava deles.
Marcus Papa
1
@ parens riship89 são necessários, prova: !! obj instanceof Arrayretornos falsos (incorretos), enquanto !!(obj instanceof Array)retorna TRUE (corretas)
zamnuts
10
O motivo é que! Obj é avaliado primeiro em if (! Obj instanceof Array), que é avaliada como true (ou false), que se torna if (bool instanceof Array), o que é obviamente falso. Portanto, envolva-o entre parênteses, conforme sugerido.
ronnbot
1
Esse motivo deve realmente fazer parte da resposta, caso contrário, essa resposta não é melhor do que a de Chris abaixo. @SergioTulentsev, você seria tão gentil e acrescentaria algo assim: 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. à sua resposta?
user0800
73
if (!(obj instanceof Array)) {
    // do something
}

É a maneira correta de verificar isso - como outros já responderam. As outras duas táticas sugeridas não funcionarão e devem ser entendidas ...

No caso do !operador sem suportes.

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

Nesse caso, a ordem de precedência é importante ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). O !operador precede o instanceofoperador. Então, !objavaliado para o falseprimeiro (é equivalente a ! Boolean(obj)); então você está testando se false instanceof Array, o que é obviamente negativo.

No caso do !operador antes do instanceofoperador.

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

Este é um erro de sintaxe. Operadores como !=um único operador, ao contrário de um NÃO aplicado a um EQUALS. Não existe um operador !instanceofda mesma maneira que não existe um !<operador.

chrismichaelscott
fonte
NB Eu teria feito disso um comentário sobre a resposta de Sergio, pois isso está obviamente correto, mas eu não era um membro da SO, portanto não tinha pontos de reputação suficientes para comentar.
Chrismichaelscott #
5
Únicas respostas que explicam o porquê de um problema (como este) deve ser aceito ...
Robert Rossmann
@chrismichaelscott Na minha opinião, e tenho certeza de que não estou sozinha, uma resposta como a sua é a mais procurada por qualquer pessoa que faça uma pergunta aqui. É claro, direto ao ponto, e compartilha informações e exemplos suficientes para contornar a questão apresentada. Muito obrigado. E acho que você merece a reputação e deveria ter sido a resposta aceita.
cram2208
42

É fácil esquecer os parênteses (colchetes) para que você possa criar o hábito de:

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

ou

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

Experimente aqui

Wilt
fonte
7
Na verdade, parece mais limpo do que negação para mim.
Kamil Latosinski