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átruese o valor for atualmenteNaN, ou se forNaNapó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átrueapenas 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.