Juste par curiosité.
Il ne semble pas très logique que ce typeof NaN
soit le nombre. Juste comme NaN === NaN
ou NaN == NaN
retournant faux, au fait. Est-ce l'une des particularités de javascript, ou y aurait-il une raison à cela?
Edit: merci pour vos réponses. Ce n'est cependant pas une chose facile à faire. En lisant les réponses et le wiki, j'ai mieux compris, mais quand même, une phrase comme
Une comparaison avec un NaN renvoie toujours un résultat non ordonné même en comparant avec lui-même. Les prédicats de comparaison sont soit de signalisation soit non de signalisation, les versions de signalisation signalent une exception invalide pour de telles comparaisons. Les prédicats d'égalité et d'inégalité ne sont pas de signalisation, donc x = x retournant false peut être utilisé pour tester si x est un NaN silencieux.
garde juste ma tête qui tourne. Si quelqu'un peut traduire cela dans un langage lisible par l'homme (par opposition à, disons, un mathématicien), je serais reconnaissant.
la source
isNumeric
plutôt vérifier le type:$.isNumeric(NaN);
renvoie false, où as$.type(NaN);
, renvoie number. api.jquery.com/jQuery.isNumericRéponses:
Cela signifie pas un nombre. Ce n'est pas une particularité de javascript mais un principe informatique commun.
Depuis http://en.wikipedia.org/wiki/NaN :
Toutes ces valeurs peuvent ne pas être les mêmes. Un test simple pour un NaN est de tester
value == value
est faux.la source
isNaN(value)
isNaN(undefined)
renvoietrue
, maisundefined == undefined
est également vrai. Il en va de même pour tous les autres types non numériques saufnull
.value !== value
c'est probablement le moyen le plus court de tester sivalue
c'est vraimentNaN
.Eh bien,
NaN
c'est toujours un type numérique , malgré le fait qu'il signifie en fait Not-A-Number :-)NaN
signifie simplement que la valeur spécifique ne peut pas être représentée dans les limites du type numérique (bien que cela puisse être dit pour tous les nombres qui doivent être arrondis pour s'adapter, maisNaN
c'est un cas particulier).Un spécifique
NaN
n'est pas considéré comme égal à un autreNaN
car il peut s'agir de valeurs différentes. Cependant,NaN
c'est toujours un type de nombre, tout comme 2718 ou 31415.Quant à votre question mise à jour à expliquer en termes simples:
Tout cela signifie (décomposé en parties):
Fondamentalement, a
NaN
n'est égal à aucun autre nombre, y compris un autreNaN
, et même lui- même inclus .Tenter d'effectuer des opérations de comparaison (inférieure à, supérieure à, etc.) entre un
NaN
nombre et un autre nombre peut soit entraîner la levée d'une exception (signalisation), soit simplement devenir fausse (sans signalisation ou silencieuse).Les tests d'égalité (égal à, différent de) ne signalent jamais, donc leur utilisation ne provoquera pas d'exception. Si vous avez un numéro régulier
x
, cex == x
sera toujours vrai. Six
est aNaN
, alorsx == x
sera toujours faux. Cela vous donne un moyen de détecterNaN
facilement (tranquillement).la source
typeof a === 'number'
signifie "a est stocké en interne en tant que flottant IEEE 754"Infinity === Infinity
retourne- t-iltrue
si unInfinity
peut être produit par différentes valeurs: 1.0 / 0.0 ou 2.0 / 0.0?1/0
et je me2/0
trouve dans la même classe et (2) il n'y a qu'une seule classe d'infini dans IEEE754 (autre que+/-
bien sûr).0/0
ne sont pas définis de manière significative, à part dire que sa "valeur" est l'ensemble complet de nombres. Et même s'ils ont été définis,Math.log(-1) == Math.log(-1)
évalue toujoursfalse
. Donc, non seulement il n'y a pas de "nombres réels" autres queNaN
mais même s'il y en avait, ils n'ont pas été utilisés pour la comparaison.La norme ECMAScript (JavaScript) spécifie qu'il
Numbers
s'agit de flottants IEEE 754 , qui incluentNaN
comme valeur possible.la source
typeof NaN
retourne'number'
parce que:La spécification ECMAScript indique que le type Number inclut NaN:
Donc
typeof
retourne en conséquence:Ce comportement est conforme à la norme IEEE pour l'arithmétique à virgule flottante (IEEE 754) :
la source
NaN est une valeur à virgule flottante valide ( http://en.wikipedia.org/wiki/NaN )
et NaN === NaN est faux car ils ne sont pas nécessairement le même non-nombre
la source
Infinity
sont en quelque sorte identiques? Des pensées?NaN != NaN
car ils ne sont pas nécessairement le même non-nombre. Cela a donc beaucoup de sens ... Aussi pourquoi les flottants ont à la fois +0,00 et -0,00 qui ne sont pas les mêmes. L'arrondi peut faire qu'ils ne sont en fait pas nuls.Quant au typeof, cela dépend de la langue. Et la plupart des langages diront que NaN est un flottant, un double ou un nombre selon la façon dont ils le classent ... Je ne connais aucun langage qui dira que c'est un type inconnu ou nul.
la source
number
,NaN
est primitif, et donc uniquement déterminé par sa valeur.NaN
signifie Pas un nombre . Il s'agit d'une valeur de types de données numériques (généralement des types à virgule flottante, mais pas toujours) qui représente le résultat d'une opération non valide telle que la division par zéro.Bien que ses noms indiquent qu'il ne s'agit pas d'un nombre, le type de données utilisé pour le contenir est un type numérique. Donc, en JavaScript, demander le type de données de
NaN
retourneranumber
(commealert(typeof(NaN))
le montre clairement).la source
Infinity
nonNaN
Javascript utilise NaN pour représenter tout ce qu'il rencontre qui ne peut pas être représenté autrement par ses spécifications. Cela ne veut pas dire que ce n'est pas un nombre. C'est simplement la manière la plus simple de décrire la rencontre. NaN signifie que lui ou un objet qui y fait référence ne peut pas être représenté d'une autre manière par javascript. À toutes fins pratiques, il est «inconnu». Étant «inconnu», il ne peut pas vous dire ce qu'il est ni même s'il est lui-même. Ce n'est même pas l'objet auquel il est assigné. Il ne peut que vous dire ce qu'il n'est pas, et le non-né ou le néant ne peut être décrit que mathématiquement dans un langage de programmation. Puisque les mathématiques concernent les nombres, javascript représente le néant sous forme de NaN. Cela ne veut pas dire que ce n'est pas un nombre. Cela signifie que nous ne pouvons pas le lire d'une autre manière qui ait du sens. C'est pourquoi ça peut ' t même égal. Parce que non.
la source
Un meilleur nom pour
NaN
, décrivant sa signification plus précisément et avec moins de confusion, serait une exception numérique . C'est en réalité un autre type d'objet d'exception déguisé en type primitif (par la conception du langage), où en même temps il n'est pas traité comme primitif dans sa fausse auto-comparaison. D'où la confusion. Et tant que la langue "ne se fera pas la volonté" de choisir entre un objet d'exception approprié et un chiffre primitif , la confusion restera.La tristement célèbre non-égalité de
NaN
lui-même, à la fois==
et===
est une manifestation de la conception déroutante forçant cet objet d'exception à être un type primitif. Cela brise le principe fondamental selon lequel une primitive est uniquement déterminée par sa valeur . Si l'NaN
on préfère être considéré comme une exception (dont il peut y avoir différents types), alors il ne doit pas être «vendu» comme primitif. Et si on veut qu'il soit primitif, ce principe doit tenir. Tant qu'il est cassé, comme nous l'avons dans JavaScript, et que nous ne pouvons pas vraiment décider entre les deux, la confusion menant à une charge cognitive inutile pour toutes les personnes impliquées restera. Ce qui, cependant, est vraiment facile à corriger en faisant simplement le choix entre les deux:NaN
un objet d'exception spécial contenant les informations utiles sur la façon dont l'exception est survenue, au lieu de jeter ces informations comme ce qui est actuellement implémenté, conduisant à un code plus difficile à déboguer;NaN
une entité de type primitifnumber
(qui pourrait être moins confuse appelée "numérique"), auquel cas elle devrait être égale à elle-même et ne peut contenir aucune autre information; ce dernier est clairement un choix inférieur.Le seul avantage concevable de forcer
NaN
dans lenumber
type est de pouvoir le renvoyer dans n'importe quelle expression numérique. Ce qui, cependant, rend le choix fragile, car le résultat de toute expression numérique contenantNaN
sera soitNaN
, soit conduira à des résultats imprévisibles tels que l'NaN < 0
évaluationfalse
, c'est- à -dire le retourboolean
au lieu de conserver l'exception.Et même si «les choses sont telles qu'elles sont», rien ne nous empêche de faire cette distinction claire pour nous-mêmes, pour aider à rendre notre code plus prévisible et plus facile à déboguer. En pratique, cela signifie identifier ces exceptions et les traiter comme des exceptions. Ce qui, malheureusement, signifie plus de code mais, espérons-le, sera atténué par des outils tels que TypeScript de Flowtype.
Et puis nous avons la distinction de signalisation
NaN
désordonnée calme vs bruyante aka . Ce qui concerne vraiment la façon dont les exceptions sont gérées, pas les exceptions elles-mêmes, et rien de différent des autres exceptions.De même,
Infinity
et+Infinity
sont des éléments de type numérique apparaissant dans l' extension de la ligne réelle mais ce ne sont pas des nombres réels. Mathématiquement, ils peuvent être représentés par des séquences de nombres réels convergeant vers l'un+
ou l' autre-Infinity
.la source
C'est simplement parce que
NaN
c'est une propriété de l'objet Number dans JS, cela n'a rien à voir avec le fait qu'il s'agit d'un nombre.la source
Number.fu = "bar"; alert(typeof Number.fu);
NaN
n'est pas la valeur stockéeNumber.NaN
, quelle qu'elle soit.NaN
est une valeur primitive de type Number. Et en plus, la valeur deNumber.NaN
estNaN
, mais ce n'est pas lié.La meilleure façon de penser à NAN est que ce n'est pas un nombre connu . C'est pourquoi NAN! = NAN parce que chaque valeur NAN représente un numéro inconnu unique. Les NAN sont nécessaires car les nombres à virgule flottante ont une plage de valeurs limitée. Dans certains cas, l'arrondi se produit lorsque les bits inférieurs sont perdus, ce qui conduit à ce qui semble être un non-sens comme 1.0 / 11 * 11! = 1.0. Les valeurs vraiment grandes qui sont plus grandes sont les NAN, l'infini étant un parfait exemple.
Étant donné que nous n'avons que dix doigts, toute tentative d'afficher des valeurs supérieures à 10 est impossible, ce qui signifie que de telles valeurs doivent être des NAN car nous avons perdu la vraie valeur de cette valeur supérieure à 10. Il en va de même pour les valeurs à virgule flottante, où la valeur dépasse les limites de ce qui peut être contenu dans un flottant.
la source
Parce que NaN est un type de données numérique.
la source
NaN
est un nombre du point de vue du type, mais n'est pas un nombre normal comme 1, 2 ou 329131. Le nom "Not A Number" fait référence au fait que la valeur représentée est spéciale et concerne le domaine de spécification du format IEEE, pas domaine de langage javascript.la source
Si vous utilisez jQuery, je préfère
isNumeric
sur vérifier le type:http://api.jquery.com/jQuery.isNumeric/
la source
isNumber
duutil
paquet dactylographiées. Bien que nous utilisons toujoursjQuery
dans notre projet, nous avons donc utilisé votre suggestion à la place.isNumber
fromutil
of typescript renvoie égalementtrue
pourNaN
.Javascript n'a qu'un seul type de données numérique, qui est le flottant standard 64 bits à double précision. Tout est double. NaN est une valeur spéciale de double, mais c'est néanmoins un double.
Tout ce que cela
parseInt
fait est de «convertir» votre chaîne en un type de données numérique, de sorte que le résultat est toujours «nombre»; seulement si la chaîne d'origine n'était pas analysable, sa valeur sera NaN.la source
NaN est toujours un type numérique, mais il représente une valeur qui ne peut pas représenter un nombre valide.
la source
Nous pourrions affirmer que NaN est un objet de cas particulier. Dans ce cas, l'objet de NaN représente un nombre qui n'a aucun sens mathématique. Il existe d'autres objets de cas spéciaux en mathématiques comme INFINITE et ainsi de suite.
Vous pouvez toujours faire des calculs avec, mais cela entraînera des comportements étranges.
Plus d'informations ici: http://www.concentric.net/~ttwang/tech/javafloat.htm (basé sur java, pas javascript)
la source
Vous devez aimer Javascript. Il a quelques petites bizarreries intéressantes.
http://wtfjs.com/page/13
La plupart de ces bizarreries peuvent être expliquées si vous vous arrêtez pour les résoudre logiquement, ou si vous connaissez un peu la théorie des nombres, mais elles peuvent néanmoins vous surprendre si vous ne les connaissez pas.
En passant, je recommande de lire le reste de http://wtfjs.com/ - il y a beaucoup plus de bizarreries intéressantes que celle-ci!
la source
La valeur NaN est vraiment le Number.NaN donc quand vous demandez si c'est un nombre, il dira oui. Vous avez fait la bonne chose en utilisant l'appel isNaN ().
Pour information, NaN peut également être retourné par des opérations sur des nombres qui ne sont pas définis comme des divisions par zéro ou la racine carrée d'un nombre négatif.
la source
NaN == Number.NaN
évalue àfalse
!NaN==NaN
être stupidefalse
, ça doit être un sadique qui a inventé ça pour faire souffrir tout le monde.Un exemple
Imaginez que nous convertissons une chaîne en nombre:
Nous avons changé le type de données en nombre mais sa valeur n'est pas un nombre!
la source
NaN
est du type numérique . La question est de savoir pourquoi.Il s'agit d'une valeur spéciale de type Number comme POSITIVE_INFINITY
Pourquoi? Intentionnellement
la source