Desde as primeiras versões da especificação de função isNaN
, seu comportamento para argumentos não numéricos tem sido confuso. Quando o argumento para a função isNaN
não é do tipo Número, o valor é primeiro forçado a um Número. O valor resultante é então testado para determinar se é NaN
. Portanto, para não-números que quando coagidos para tipo numérico resultam em um valor numérico não NaN válido (notavelmente a string vazia e primitivos booleanos, que quando coagidos fornecem valores numéricos zero ou um), o valor “falso” retornado pode ser inesperado; a string vazia, por exemplo, certamente “não é um número”. A confusão origina-se do fato de que o termo, “não um número”, tem um significado específico para números representados como valores de ponto flutuante IEEE-754. A função deve ser interpretada como uma resposta à pergunta, “este valor, quando forçado a um valor numérico, é um valor IEEE-754” Não é um número “?”
ECMAScript 2015 contém o Number.isNaN()
. Number.isNaN(x)
é uma maneira confiável de testar se x
é NaN
ou não. Mesmo com Number.isNaN
, no entanto, o significado de NaN
permanece o significado numérico preciso e não, “não é um número”. Como alternativa, na ausência de Number.isNaN
, a expressão (x != x)
é uma maneira mais confiável de testar se a variável x
é NaN
ou não, pois o resultado não está sujeito aos falsos positivos que tornam isNaN
não confiável.
Um polyfill para isNaN
seria (o polyfill aproveita a característica nunca igual a si mesmo de NaN
):