O JavaScript embutido isNaN função, é - como seria de esperar por padrão - um "tipo de operador dinâmico". Portanto, todos os valores que (durante o processo DTC) podem gerar um valor verdadeiro simples | falso como"", " ", " 000"
, não pode ser NaN.
Significando que o argumento fornecido passará primeiro por uma conversão como em:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
Explicação:
Na linha superior do corpo da função, estamos (primeiro) tentando converter com êxito o argumento em um objeto numérico. E (segundo), usando o operador de ponto, estamos - para nossa própria conveniência - retirando imediatamente, o valor primitivo do objeto criado.
Na segunda linha, estamos pegando o valor obtido na etapa anterior e a vantagem do fato de NaN não ser igual a nada no universo, nem mesmo a si mesmo, por exemplo:NaN == NaN >> false
para finalmente compará-lo (por desigualdade) consigo mesmo .
Dessa forma, o retorno da função produzirá true somente quando, e somente se, o retorno do argumento fornecido, for uma tentativa falha de conversão para um objeto numérico, ou seja, um número não-numérico; por exemplo, NaN.
isNaNstatic ()
No entanto, para um operador de tipo estático - se necessário e quando necessário - podemos escrever uma função muito mais simples, como:
function isNaNstatic(x){
return x != x;
}
E evite o DTC completamente para que, se o argumento não for explicitamente um número NaN, ele retornará falso. Portanto, testando contra o seguinte:
isNaNStatic(" x"); // will return false
porque ainda é uma corda.
No entanto:
isNaNStatic(1/"x"); // will of course return true.
como será, por exemplo,isNaNStatic(NaN); >> true
.
Mas isNaN
, ao contrário do , isNaNStatic("NaN"); >> false
porque (o argumento) é uma string comum.
ps: A versão estática do isNaN pode ser muito útil em cenários de codificação modernos. E pode muito bem ser uma das principais razões pelas quais dediquei meu tempo postando isso.
Saudações.