Verificar se há NaN (“não é um número”) é tão simples quanto verificar a auto-igualdade em JavaScript.
Em JavaScript, o valor especial
NaN
(que significa” não é um número “) é usado para representar o resultado de um cálculo matemático que não pode ser representado como um número significativo. – Joshua Clanton em Drip of JavaScript
O valor especial NaN
aparece no JavaScript quando Math
as funções falham (Math.sqrt(-37)
) ou quando uma função que tenta analisar um número falha (parseInt("No integers here")
).
NaN
então envenena todas as outras funções matemáticas, levando a todas as outras operações matemáticas resultando em NaN
.
Observe que em JavaScript, a divisão por 0 retorna Infinity
, não NaN
:
Este resultado é devido à forma como o Poi flutuante nt é definido, de forma mais geral do que apenas Javascript. Porque? Grosso modo, porque 1/0 é o limite de 1 / x quando x se aproxima de zero. E 0/0 não tem nenhuma interpretação razoável, portanto NaN
.
O que é NaN, afinal?
NaN é uma propriedade do objeto global. O valor inicial de NaN é Not-A-Number – o mesmo que o valor de Number.NaN. – Documentos MDN
Verificar se há NaN é mais difícil do que parece
Infelizmente, há dois problemas ao tentar verificar NaN
:
- O
typeof NaN
é” número ” -
NaN
é diferente de qualquer outro valor em JavaScript
Confira este exemplo de código:
Então, como verificamos se temos um NaN
valor que envenena a matemática?
Verifique se há NaN com auto-igualdade
” NaN, e apenas NaN, será comparado a si mesmo. ” – MDN Docs
Em JavaScript, a melhor maneira de verificar NaN
é verificando a auto-igualdade usando um dos operadores de igualdade integrados, ==
ou ===
.
Porque NaN
não é igual a si mesmo, NaN != NaN
sempre retornará true
.
Claro, tal NaN
teste em seu código nem sempre é legível, então é uma boa ideia usar um comentário ou criar uma função de wrapper:
Não faz diferença se você usar !=
ou !==
para verificar NaN
.
Verifique se há NaN com Object.is ()
” O
Object.is()
determina se dois valores são o mesmo valor.”- MDN Docs
Ao contrário dos operadores de igualdade estrita e flexível, o método auxiliar ES6 Object.is()
não considera NaN
para ser igual a si mesmo:
Portanto, se você trocar ===
por Object.is()
, nunca terá que se preocupar sobre como verificar NaN
de qualquer maneira especial. Problema resolvido!
Eu escrevi sobre como usar Object.is()
em JavaScript em outro artigo:
Uma nota sobre terminologia – Object.is()
é uma função da classe Object
global, não a chamo de “operador de igualdade” como ==
ou ===
.
Por exemplo, em testes de Jest, o método .toBe()
que usa ===
é diferente do método .toEqual()
que usa Object.is()
.
Para encerrar aqui, devo mencionar que um JavaScript ES6 Set
, que é usado para encontrar valores únicos, manterá apenas uma cópia de um NaN
valor.
Uma palavra sobre Número .isNan ()
O JavaScript moderno já tem uma implementação para verificar NaN
chamado Number.isNan()
que funciona como você pensa seria. Por exemplo:
Observe que Number.isNan()
é diferente da função isNan()
global, que é uma implementação mais antiga cujo objetivo real é verificar se um valor não pode ser forçado a um número.
Aqui está a diferença, para integridade:
-
isNaN()
retornarátrue
se o valor for atualmenteNaN
, ou se forNaN
após ser forçado a um número. Em outras palavras, se receber um valor que pode ser forçado a um número, isNaN () retornará falso. -
Number.isNaN()
retornarátrue
apenas se o valor forNaN
.
Portanto, se você oferece suporte a navegadores antigos (especialmente o Internet Explorer) que não oferecem suporte a Number.isNan()
, então é melhor verificar a auto-igualdade.