Antes de tudo, quero mencionar que sei como isNaN()
e Number.isNaN()
trabalho. Estou lendo O guia definitivo de David Flanagan e ele fornece um exemplo de como verificar se o valor é NaN
:
x !== x
Isso resultará em true
se e somente se x
for NaN
.
Mas agora eu tenho uma pergunta: por que ele usa uma comparação estrita? Porque parece que
x != x
se comporta da mesma maneira. É seguro usar as duas versões ou faltam alguns valores em JavaScript que retornarão true
para x !== x
e false
para x != x
?
javascript
nan
Giorgi Nakeuri
fonte
fonte
!==
cheques sobre!=
cheques. Tanto quanto sei, não há outro valor em quex != x
. Mas existem dois grupos distintos de desenvolvedores de JavaScript: aqueles que preferem!=
e aqueles que preferem!==
, seja por velocidade, clareza, expressividade etc.NaN
não é um tipo único, é um número. É um valor único que não é igual a si mesmo.===
com NaN para enfatizar que NaN não é igual a si mesmo. Ele não está "errado", está fazendo isso como um exercício de ensino, demonstrando que não funciona.Respostas:
Primeiro, deixe-me salientar que
NaN
é um valor muito especial: por definição, não é igual a si mesmo. Isso vem do padrão IEEE-754 que os números JavaScript utilizam. O valor "não é um número" nunca é igual a si mesmo, mesmo quando os bits são uma correspondência exata. (Que eles não estão necessariamente no IEEE-754, ele permite vários valores diferentes de "não é um número".) É por isso que isso acontece; todos os outros valores em JavaScript são iguais a eles mesmos,NaN
é apenas especial.Não, você não é. A única diferença entre
!==
e!=
é que este último fará a coerção de tipos, se necessário, para obter os tipos dos operandos iguais. Emx != x
, os tipos dos operandos são os mesmos e, portanto, são exatamente os mesmos quex !== x
.Isso fica claro desde o início da definição da Operação de Igualdade Abstrata :
Os dois primeiros passos são o encanamento básico. Portanto, com efeito, o primeiro passo
==
é verificar se os tipos são iguais e, se for o caso, fazê-lo===
.!=
e!==
são apenas versões negadas disso.Portanto, se Flanagan estiver correto, que somente
NaN
dará verdade parax !== x
, podemos ter certeza de que também é verdade que somenteNaN
dará parax != x
.Muitos programadores de JavaScript usam o padrão
===
e!==
evitam algumas armadilhas em torno da coerção de tipo que os operadores soltos fazem, mas não há nada para ler sobre o uso de Flanagan do operador estrito versus frouxo neste caso.fonte
4.9.1 - Equality and Inequality Operators
seção e essa parece ser a resposta. O ponto-chave para a===
comparação é:If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
.a
na verdade é uma função e não retorna o mesmo valor duas vezes? Não é a mesma coisa que um valor para o qual!==
seria verdade, e é sobre isso que o OP perguntou. É apenas uma função que retorna valores diferentes.foo() !== foo()
também não é necessariamente verdade, poisfoo
pode retornar valores diferentes em cada chamada.Para fins de NaN,
!=
e!==
fazer a mesma coisa.No entanto, muitos programadores evitam
==
ou!=
em JavaScript. Por exemplo, Douglas Crockford os considera entre as " partes ruins " da linguagem JavaScript porque se comportam de maneiras inesperadas e confusas:fonte
Apenas por diversão, deixe-me mostrar um exemplo artificial onde
x
não existe,NaN
mas os operadores se comportam de maneira diferente de qualquer maneira. Primeiro defina:Então nós temos
mas
fonte
foo() != foo()
onde foo retorna 1 e 2. Por exemplo, os valores não são os mesmos, é apenas comparar valores diferentes.Eu só quero apontar
NaN
não é a única coisa que produzx !== x
sem usar o objeto global. Existem muitas maneiras inteligentes de desencadear esse comportamento. Aqui está um usando getters:Como outras respostas apontam,
==
executa coerção de tipo, mas como em outros idiomas e pelo padrão - NaN indica uma falha de computação e, por boas razões, não é igual a si mesmo.Por alguma razão, além de mim, as pessoas consideram isso um problema com o JS, mas a maioria das linguagens que possuem duplas (a saber, C, Java, C ++, C #, Python e outras) exibe esse comportamento exato e as pessoas estão bem com isso.
fonte
Como às vezes as imagens são melhores que as palavras, verifique esta tabela (que é o motivo para eu fazer disso uma resposta, em vez de um comentário, porque obtém uma melhor visibilidade).
Lá você pode ver que a comparação estrita de igualdade (===) só retorna true se tipo e conteúdo corresponderem, portanto
Enquanto a comparação de igualdade abstrata (==) verifica apenas o conteúdo *, convertendo tipos e comparando-os estritamente:
Embora não seja claro, sem consultar a ECMA , o que o JavaScript considera ao comparar, de uma maneira que o código abaixo é avaliado como verdadeiro.
fonte