Como verificar se há NaN em JavaScript

Verificar se há NaN (“não é um número”) é tão simples quanto verificar a auto-igualdade em JavaScript.

Dr. Derek Austin 🥳

Seguir

15 de setembro de 2019 · 4 min de leitura

Foto de Rattap em Unsplash

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.

Foto de Chris Barbalis no Unsplash

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

Foto de Andrew Buchanan no Unsplash

Verificar se há NaN é mais difícil do que parece

Infelizmente, há dois problemas ao tentar verificar NaN:

  1. O typeof NaN é” número ”
  2. 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?

Foto de Wolfgang Rottmann no Unsplash

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.

Foto de Erik Mclean no Unsplash

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.

Foto de Tony Hand no Unsplash

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 atualmente NaN, ou se for NaN 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 for NaN.

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.

Foto de Nick Hillier em Unsplash

Leave a Reply

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *