web-dev-qa-db-fra.com

Pourquoi JavaScript dit qu'un nombre n'est pas un nombre?

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:

  • Le type de 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.
28
Arseni Mourzenko

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).

21
Andrzej Doyle

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.

14
tvanfosson

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.

1
Janick Bernet

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
1
user347594

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.

0
qw3n

Vous devriez vérifier l'article Wikipedia . Il a plus de détails.

0
Jørgen Fogh