Questo articolo richiede una revisione stilistica. Scopri come puoi essere d’aiuto.`
Sommario
La funzione isNaN()
determina se un valore è NaN
o no.
Nota: le conversioni di tipo nella funzione isNaN
seguono delle regole particolari: alternativamente per determinare se un valore non è un numero si può usare la funzione Number.isNaN()
, definito in ECMAScript 6, o l'operatore typeof
.
Sintassi
isNaN(number)
Parametri
number
- Il valore da controllare.
Descrizione
La necessità di una funzione isNaN()
A differenza di tutti gli altri valori in JavaScript, non è possibile usare gli operatori di uguaglianza (==
e ===
) per determinare se un valore è NaN
oppure no, perché entrambe le uguaglianze NaN == NaN
e NaN === NaN
vengono considerate false. Ecco perché è necessaria una funzione isNaN()
.
L'origine del valore NaN
Il valore NaN
è generato da un'operazione aritmetica il cui risultato è undefined
o un valore non rappresentabile. Tali valori non rappresentano necessariamente un valore oltre i limiti. NaN
può anche essere il risultato del trasformare valori non-numerici dai quali non è possibile ottenere un numero in numeri.
Per esempio, dividere zero per zero restituisce NaN, ma dividere un qualsiasi altro numero per zero no.
Comportamenti particolari
Già dalla prima versione della specifica della funzione isNaN
, il suo comportamento con valori non-numerici può confondere. Quando il parametro della funzione isNaN
non è di tipo Number
, questo viene prima trasformato in un numero. Il test per determinare se il parametro è NaN
viene effettuato sul valore convertito. Quindi per i valori non-numerici che possono essere trasformati in un numero diverso da NaN
la funzione restituisce false
. La stringa vuota, per esempio, suciramente non è un numero, ma la funzione restituisce false
. La confusione nasce dal fatto che il termine "not a number" (rappresentato da NaN
) ha un significato per i numeri rappresentati come valori a virgola mobile IEEE-754. La funzione dovrebbe quindi essere interpretata come "È questo valore, quando convertito in un numero, un valore "Not a Number" secondo lo standard IEEE-754?"
La prossima versione di ECMAScript (ES6) definiesce la funzione Number.isNaN()
. Number.isNaN()
, che ritorna false
per tutti i valori non-numerici, sarà un metodo affidabile per sapere se un numero è NaN
o no. In assenza di Number.isNaN
, l'espressione (x !== x)
è il metodo più affidabile per determinare se un numero è NaN
oppure no, perché evita i falsi positivi generati dalla funzione isNaN()
.
Esempi
var x = NaN; isNaN(x); // true Number.isNaN(x); // true x !== x; // true var x = undefined; isNaN(x); // true, perché undefined viene convertito in NaN Number.isNaN(x); // false x !== x; // false var x = {}; isNaN(x); // true, perché {} viene convertito in NaN Number.isNaN(x); // false x !== x; // false isNaN(true); // false, perché true viene convertito in 1 isNaN(null); // false, perché null viene convertito in 0 isNaN(37); // false // Stringhe isNaN("37"); // false, perché "37" viene convertito in 37 isNaN("37.37"); // false, perché "37.37" viene convertito in 37.37 isNaN(""); // false, perché una stringa vuota viene convertita in 0 isNaN(" "); // false, perché una stringa con soli spazi viene convertita in 0 // !!! Ecco un esempio di falso positivo var x = "37ab"; isNaN(x); // true, perché "37ab" viene convertito in NaN Number.isNaN(x); // false x !== x; // false // Date isNaN(new Date()); // false, perché una data che viene convertita in un // numero ritorna un valore intero var x = new Date().toString(); isNaN(x); // true, perché il metodo new Date().toString() restituisce una // stringa alfanumerica, che viene convertita in NaN Number.isNaN(x); // false x !== x; // false
Specifiche
Specifica | Stato | Commenti |
---|---|---|
ECMAScript 1st Edition. | Standard | Definizione iniziale. |
ECMAScript 5.1 (ECMA-262) The definition of 'isNaN' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'isNaN' in that specification. |
Standard |
Compatibilità con i browser
Funzionalità | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Supporto di base | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Funzionalità | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Supporto di base | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |