Apenas por curiosidade.
Não parece muito lógico que typeof NaN
seja o número. Assim como NaN === NaN
ouNaN == NaN
retornando falso, a propósito. Essa é uma das peculiaridades do javascript, ou haveria uma razão para isso?
Edit: obrigado por suas respostas. Não é uma coisa fácil de entender. Lendo as respostas e o wiki, eu entendi mais, mas ainda assim, uma frase como
Uma comparação com um NaN sempre retorna um resultado não ordenado, mesmo quando comparado a si mesmo. Os predicados de comparação são sinalização ou não sinalização, as versões de sinalização sinalizam uma exceção inválida para essas comparações. Os predicados de igualdade e desigualdade são sem sinalização, portanto x = x retornando false pode ser usado para testar se x é um NaN silencioso.
apenas mantém minha cabeça girando. Se alguém pudesse traduzir isso em linguagem legível humana (em oposição a, digamos, matemática), eu ficaria agradecido.
fonte
isNumeric
verificar o tipo:$.isNumeric(NaN);
retorna false, onde como$.type(NaN);
, retorna número. api.jquery.com/jQuery.isNumeric #Respostas:
Significa Não é um número. Não é uma peculiaridade do javascript, mas um princípio comum da ciência da computação.
De http://en.wikipedia.org/wiki/NaN :
Todos esses valores podem não ser os mesmos. Um teste simples para um NaN é testar
value == value
é falso.fonte
isNaN(value)
isNaN(undefined)
retornatrue
, masundefined == undefined
também é verdade. O mesmo vale para todos os outros tipos não-numéricos, excetonull
.value !== value
é provavelmente a maneira mais curta de testar sevalue
é realmenteNaN
.Bem,
NaN
ainda é um tipo numérico , apesar de na verdade representar Not-A-Number :-)NaN
significa apenas que o valor específico não pode ser representado dentro das limitações do tipo numérico (embora isso possa ser dito para todos os números que precisam ser arredondados para caber, masNaN
é um caso especial).Um específico
NaN
não é considerado igual a outroNaN
porque pode ter valores diferentes. No entanto,NaN
ainda é um tipo de número, assim como 2718 ou 31415.Quanto à sua pergunta atualizada para explicar em termos leigos:
Tudo isso significa é (dividido em partes):
Basicamente, a
NaN
não é igual a nenhum outro número, incluindo outroNaN
e até mesmo a si próprio .Tentar fazer operações de comparação (menor que, maior que etc.) entre um
NaN
e outro número pode resultar no lançamento de uma exceção (sinalização) ou em apenas ficar falso como resultado (sem sinalização ou silencioso).Os testes de igualdade (igual a, diferente de) nunca estão sinalizando, portanto, usá-los não causará uma exceção. Se você tiver um número regular
x
,x == x
sempre será verdadeiro. Sex
for aNaN
,x == x
sempre será falso. Está lhe dando uma maneira de detectarNaN
facilmente (silenciosamente).fonte
typeof a === 'number'
significa "a é armazenado internamente como um flutuador IEEE 754"Infinity === Infinity
retornartrue
se umInfinity
pode ser produzido por valores diferentes: 1.0 / 0.0 ou 2.0 / 0.0?1/0
e2/0
pertenço à mesma classe e (2) há apenas uma classe de infinito no IEEE754 (exceto, é+/-
claro).0/0
não são definidos de maneira significativa, exceto por dizer que seu "valor" é todo o conjunto de números. E mesmo se eles foram definidos,Math.log(-1) == Math.log(-1)
ainda avalia comofalse
. Portanto, não apenas não existem "números reais",NaN
mas, mesmo que existam, eles não foram usados para comparação.O padrão ECMAScript (JavaScript) especifica que
Numbers
são flutuadores IEEE 754 , que incluemNaN
como um valor possível.fonte
typeof NaN
retorna'number'
porque:A especificação ECMAScript diz que o tipo Number inclui NaN:
Então
typeof
retorna em conformidade:Esse comportamento está de acordo com o padrão IEEE para aritmética de ponto flutuante (IEEE 754) :
fonte
NaN é um valor de ponto flutuante válido ( http://en.wikipedia.org/wiki/NaN )
e NaN === NaN é falso porque eles não são necessariamente o mesmo não número
fonte
Infinity
são idênticos? Alguma ideia?NaN != NaN
porque eles não são necessários o mesmo número não. Portanto, faz muito sentido ... Também porque os carros alegóricos têm +0,00 e -0,00 que não são iguais. O arredondamento pode fazer com que eles não sejam realmente zero.Quanto ao typeof, isso depende do idioma. E a maioria dos idiomas dirá que NaN é um número flutuante, duplo ou número, dependendo de como eles o classificam ... Não conheço idiomas que digam que esse é um tipo desconhecido ou nulo.
fonte
number
,NaN
é primitivo e, portanto, determinado exclusivamente por seu valor.NaN
significa Não é um número . É um valor de tipos de dados numéricos (geralmente tipos de ponto flutuante, mas nem sempre) que representa o resultado de uma operação inválida, como dividir por zero.Embora seus nomes digam que não é um número, o tipo de dados usado para retê-lo é um tipo numérico. Assim, em JavaScript, a solicitação do tipo de dados
NaN
retornaránumber
(comoalert(typeof(NaN))
demonstra claramente).fonte
Infinity
não #NaN
Javascript usa NaN para representar qualquer coisa que encontrar e que não possa ser representada de nenhuma outra maneira por suas especificações. Isso não significa que não é um número. É apenas a maneira mais fácil de descrever o encontro. NaN significa que ele ou um objeto que se refere a ele não pode ser representado de nenhuma outra maneira por javascript. Para todos os fins práticos, é "desconhecido". Sendo "desconhecido", não pode dizer o que é nem mesmo se é ele próprio. Não é nem o objeto ao qual está atribuído. Ele pode apenas dizer o que não é, e não-nada ou nada só podem ser descritos matematicamente em uma linguagem de programação. Como a matemática é sobre números, o javascript não representa nada como NaN. Isso não significa que não é um número. Isso significa que não podemos ler de outra maneira que faça sentido. É por isso que pode " nem se iguala. Porque não.
fonte
Um nome melhor para
NaN
, descrevendo seu significado de maneira mais precisa e menos confusa, seria uma exceção numérica . É realmente outro tipo de objeto de exceção disfarçado de tipo primitivo (pelo design da linguagem), onde, ao mesmo tempo, não é tratado como primitivo em sua falsa auto-comparação. De onde a confusão. E enquanto a linguagem "não se decidir" em escolher entre o objeto de exceção apropriado e o numeral primitivo , a confusão permanecerá.A infame não igualdade de
NaN
si mesma, ambas==
e===
é uma manifestação do design confuso que força esse objeto de exceção a ser um tipo primitivo. Isso quebra o princípio fundamental de que um primitivo é determinado exclusivamente por seu valor . SeNaN
preferir ser visto como exceção (da qual pode haver tipos diferentes), não deve ser "vendido" como primitivo. E se se deseja que seja primitivo, esse princípio deve se manter. Enquanto estiver quebrado, como temos em JavaScript, e não podemos realmente decidir entre os dois, a confusão que leva a uma carga cognitiva desnecessária para todos os envolvidos permanecerá. O que, no entanto, é realmente fácil de corrigir, basta escolher entre os dois:NaN
um objeto de exceção especial contendo as informações úteis sobre como a exceção surgiu, em vez de jogar fora essas informações como o que está implementado atualmente, levando a um código mais difícil de depurar;NaN
uma entidade do tipo primitivonumber
(que poderia ser menos confundidamente chamado de "numérico"); nesse caso, deve ser igual a si mesmo e não pode conter outras informações; o último é claramente uma escolha inferior.A vantagem única concebível de forçar
NaN
emnumber
tipo é ser capaz de jogá-lo de volta para qualquer expressão numérica. O que, no entanto, torna a opção frágil, porque o resultado de qualquer expressão numérica que contenhaNaN
seráNaN
ou levará a resultados imprevisíveis, comoNaN < 0
avaliarfalse
, ou seja, retornar emboolean
vez de manter a exceção.E mesmo que "as coisas sejam do jeito que são", nada nos impede de fazer essa distinção clara para nós mesmos, para ajudar a tornar nosso código mais previsível e mais fácil de depurar. Na prática, isso significa identificar essas exceções e lidar com elas como exceções. O que, infelizmente, significa mais código, mas espero que seja atenuado por ferramentas como o TypeScript do Flowtype.
E então nós temos a distinção bagunçada silenciosa vs barulhenta, também conhecida como sinalização
NaN
. O que realmente é sobre como as exceções são tratadas, não as próprias exceções e nada diferente de outras exceções.Da mesma forma,
Infinity
e+Infinity
são elementos do tipo numérico que surgem na extensão da linha real, mas não são números reais. Matematicamente, eles podem ser representados por sequências de números reais convergindo para um+
ou para-Infinity
.fonte
Isso é simplesmente porque
NaN
é uma propriedade do objeto Number em JS. Ele não tem nada a ver com ser um número.fonte
Number.fu = "bar"; alert(typeof Number.fu);
NaN
não é o valor armazenadoNumber.NaN
, qualquer que seja.NaN
é um valor primitivo do tipo Number. Além disso, o valor deNumber.NaN
éNaN
, mas isso não está relacionado.A melhor maneira de pensar em NAN é que não é conhecido número . É por isso que NAN! = NAN, porque cada valor NAN representa algum número desconhecido exclusivo. NANs são necessários porque os números de ponto flutuante têm um intervalo limitado de valores. Em alguns casos, o arredondamento ocorre onde os bits inferiores são perdidos, o que leva ao que parece ser um absurdo como 1,0 / 11 * 11! = 1,0. Valores realmente grandes e maiores são as NANs, com o infinito sendo um exemplo perfeito.
Dado que temos apenas dez dedos, qualquer tentativa de mostrar valores maiores que 10 é impossível, o que significa que esses valores devem ser NANs porque perdemos o valor real desse valor maior que 10. O mesmo vale para valores de ponto flutuante, em que o valor excede os limites do que pode ser mantido em um flutuador.
fonte
Porque NaN é um tipo de dados numérico.
fonte
NaN
é um número do ponto de vista do tipo, mas não é um número normal como 1, 2 ou 329131. O nome "Não é um número" refere-se ao fato de que o valor representado é especial e se refere ao domínio de especificação do formato IEEE, não domínio da linguagem javascript.fonte
Se estiver usando jQuery, prefiro
isNumeric
verificar o tipo:http://api.jquery.com/jQuery.isNumeric/
fonte
isNumber
a partirutil
do pacote de Dactilografado. Bom que ainda usamosjQuery
em nosso projeto, usei sua sugestão.isNumber
from fromutil
typescript também retornatrue
paraNaN
.Javascript possui apenas um tipo de dados numérico, que é o padrão de precisão dupla de 64 bits. Tudo é duplo. NaN é um valor especial de double, mas é um double, no entanto.
Tudo o que
parseInt
faz é "converter" sua string em um tipo de dados numérico, para que o resultado seja sempre "number"; somente se a sequência original não for analisável, seu valor será NaN.fonte
NaN ainda é um tipo numérico, mas representa um valor que não pôde representar um número válido.
fonte
Poderíamos argumentar que NaN é um objeto de caso especial. Nesse caso, o objeto do NaN representa um número que não faz sentido matemático. Existem outros objetos especiais de caso em matemática, como INFINITE e assim por diante.
Você ainda pode fazer alguns cálculos com isso, mas isso produzirá comportamentos estranhos.
Mais informações aqui: http://www.concentric.net/~ttwang/tech/javafloat.htm (baseado em java, não javascript)
fonte
Você precisa amar o Javascript. Tem algumas peculiaridades interessantes.
http://wtfjs.com/page/13
A maioria dessas peculiaridades pode ser explicada se você parar para resolvê-las logicamente, ou se você conhece um pouco da teoria dos números, mas, mesmo assim, elas ainda podem capturá-lo se você não souber sobre elas.
A propósito, eu recomendo a leitura do restante de http://wtfjs.com/ - há muitas peculiaridades mais interessantes do que essa!
fonte
O valor NaN é realmente o Number.NaN, portanto, quando você pergunta se é um número, ele diz que sim. Você fez a coisa correta usando a chamada isNaN ().
Para obter informações, o NaN também pode ser retornado por operações em Números que não são definidos como divisões por zero ou raiz quadrada de um número negativo.
fonte
NaN == Number.NaN
avalia parafalse
!NaN==NaN
ser estúpidofalse
, deve ter sido um sádico que inventou isso para fazer todo mundo sofrer.Um exemplo
Imagine Estamos convertendo uma string para um número:
Alteramos o tipo de dados para número, mas seu valor não é um número!
fonte
NaN
é do tipo de número . A questão está se perguntando o porquê.É um valor especial do tipo Número como POSITIVE_INFINITY
Por quê? Por design
fonte