J'ai un morceau de code JavaScript qui devrait définir une valeur entière pour une variable.
Quelque chose est cassé, donc quand j'essaie de faire alert(A);
, il retourne NaN
. isNaN(A);
renvoie vrai. Mais si je alert(typeof(A));
, il dit number
.
Alors, comment une variable peut-elle être un nombre et non un nombre en même temps? Peut-être que j'ai mal compris ce qu'est vraiment NaN?
Edit: grâce aux réponses, je vois que j'avais tort, car:
NaN
est Number
,NaN
signifie "Pas un nombre", ce qui n'est pas la même chose que "pas de type Number
",0/0
est un bon exemple de NaN
: c'est toujours un nombre, mais JavaScript (et personne d'autre) peut dire quelle est la valeur réelle de zéro divisée par zéro. 1/0
d'autre part renvoie Infinity
, qui n'est pas NaN
.Si je comprends bien, NaN
est une instance sentinelle de la classe Number
qui représente, eh bien, exactement ce qu'elle représente - des résultats numériques qui ne peuvent pas être représentés de manière adéquate. Alors 0/0
n'est pas un nombre, dans le sens où c'est NaN
, mais is a Number
en termes de type.
Peut-être aurait-il dû s'appeler NaRN (Not a Representable Number).
Si vous avez une variable et lui affectez le résultat de 0/0, la variable est toujours de type numérique, mais la valeur n'est pas définie (pas un nombre). Il existe d'autres conditions dans lesquelles cela peut se produire, mais cela illustre ce que vous voyez.
Vous confondez le type de votre objet avec le valeur. NaN
est une valeur spécifique avec laquelle un objet de type number
peut être affecté, par exemple dans le cas d'une division de zéro par zéro ou lors d'une tentative de conversion d'un nombre à partir d'une chaîne qui ne ne représentent pas un nombre.
Quelques définitions de W3Schools:
Infini: une valeur numérique qui représente l'infini positif/négatif
La propriété POSITIVE_INFINITY représente l'infini, renvoyé en cas de débordement. NEGATIVE_INFINITY, représente l'infini négatif (retourné en cas de débordement).
La propriété NaN représente la valeur "Not-a-Number". Cette propriété indique qu'une valeur n'est pas un nombre légal.
La fonction isFinite () détermine si un nombre est un nombre fini et légal. Cette fonction retourne false si la valeur est + infini, -infinité ou NaN.
Quelques tests:
var n1 = 1/0;
var n2 = 0/0;
var n3 = (Number.MAX_VALUE)*2; //overflow
var b1 = Number.POSITIVE_INFINITY == n1;
var b2 = Number.POSITIVE_INFINITY == n2;
var b2n = Number.NEGATIVE_INFINITY == n2;
var b3 = Number.POSITIVE_INFINITY == n3;
var msg = "n1=" + n1 + ", n2=" + n2 + ", n3=" + n3;
msg += "<br/> n1 Is POSITIVE_INFINITY=" + b1;
msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2;
msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2n;
msg += "<br/> n3 Is POSITIVE_INFINITY=" + b3;
msg += "<br/> n1 IsFinite=" + isFinite(n1);
msg += "<br/> n2 IsFinite=" + isFinite(n2);
msg += "<br/> n3 IsFinite=" + isFinite(n3);
msg += "<br/> n1 + n1 =" + (n1 + n1) ;
msg += "<br/> n1 - n1 =" + (n1 - n1) ;
msg += "<br/> n2 + n1 =" + (n2 + n1) ;
document.write(msg);
Spectacles
n1=Infinity, n2=NaN, n3=Infinity
n1 Is POSITIVE_INFINITY=true
n2 Is POSITIVE_INFINITY=false
n2 Is POSITIVE_INFINITY=false
n3 Is POSITIVE_INFINITY=true
n1 IsFinite=false
n2 IsFinite=false
n3 IsFinite=false
n1 + n1 =Infinity
n1 - n1 =NaN
n1 - n1 =NaN
Avec ce qui a été dit, je pense que si vous divisez par exemple une chaîne. Il essaie de retourner NaN mais le regarde toujours comme un nombre.
Vous devriez vérifier l'article Wikipedia . Il a plus de détails.