Perché JavaScript dice che un numero non è un numero?

Ho un pezzo di codice JavaScript che dovrebbe impostare un valore intero su una variabile.

Qualcosa è rotto, quindi quando provo a fare alert(A); , restituisce NaN . isNaN(A); ritorna vero Ma se alert(typeof(A)); , dice il number .

Quindi, come può una variabile essere un numero e non un numero allo stesso tempo? Forse ho frainteso ciò che NaN è davvero?


Modifica: grazie alle risposte, vedo che ho sbagliato, perché:

  • Il tipo di NaN è Number ,
  • NaN significa “Non un numero”, che non è la stessa cosa di “non di tipo Number “,
  • 0/0 è un buon esempio di NaN : è ancora un numero, ma JavaScript (e nessun altro) può dire quale sia il valore reale di zero diviso per zero. 1/0 invece restituisce Infinity , che non è NaN .

A quanto ho capito, NaN è un’istanza sentinella della class Number che rappresenta, beh, esattamente ciò che rappresenta – risultati numerici che non possono essere adeguatamente rappresentati. Quindi 0/0 non è un numero, nel senso che è NaN , ma è un Number in termini di tipo.

Forse avrebbe dovuto essere chiamato NaRN (Not a Representable Number).

Se si dispone di una variabile e si assegna il risultato di 0/0, la variabile è ancora di tipo numerico, ma il valore non è definito (non un numero). Ci sono altre condizioni in cui ciò può accadere, ma questo illustra ciò che stai vedendo.

Stai confondendo il tipo di object con il valore . NaN è un valore specifico a cui può essere assegnato un object di tipo number , ad esempio nel caso di divisione di zero per zero o quando si tenta di convertire un numero da una stringa che non rappresenta un numero.

Alcune definizioni di W3Schools:

Infinito: un valore numerico che rappresenta l’infinito positivo / negativo

La proprietà POSITIVE_INFINITY rappresenta infinito, restituito in overflow. NEGATIVE_INFINITY, rappresenta l’infinito negativo (restituito in overflow).

La proprietà NaN rappresenta il valore “Not-a-Number”. Questa proprietà indica che un valore non è un numero legale.

La funzione isFinite () determina se un numero è un numero limitato e legale. Questa funzione restituisce false se il valore è + infinito, -infinity o NaN.

Alcuni test:

  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 += "
n1 Is POSITIVE_INFINITY=" + b1; msg += "
n2 Is POSITIVE_INFINITY=" + b2; msg += "
n2 Is POSITIVE_INFINITY=" + b2n; msg += "
n3 Is POSITIVE_INFINITY=" + b3; msg += "
n1 IsFinite=" + isFinite(n1); msg += "
n2 IsFinite=" + isFinite(n2); msg += "
n3 IsFinite=" + isFinite(n3); msg += "
n1 + n1 =" + (n1 + n1) ; msg += "
n1 - n1 =" + (n1 - n1) ; msg += "
n2 + n1 =" + (n2 + n1) ; document.write(msg);

Spettacoli

 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 

Insieme a ciò che è stato detto, penso che se dividi per esempio una stringa. Si riprende a restituire NaN ma continua a guardarlo come un numero.

Dovresti dare un’occhiata all’articolo di Wikipedia . Ha più dettagli.