--- title: isNaN() slug: Web/JavaScript/Reference/Global_Objects/isNaN translation_of: Web/JavaScript/Reference/Global_Objects/isNaN ---
La funzione isNaN()
determina se un valore è {{jsxref("NaN")}} o no.
Nota: le conversioni di tipo nella funzione isNaN
seguono delle regole {{jsxref("Global_Objects/isNaN", "particolari", "#Description", 1)}}: alternativamente per determinare se un valore non è un numero si può usare la funzione {{jsxref("Number.isNaN()")}}, definito in ECMAScript 6, o l'operatore {{jsxref("Operators/typeof", "typeof")}}.
isNaN(number)
number
isNaN()
A differenza di tutti gli altri valori in JavaScript, non è possibile usare gli operatori di uguaglianza (==
e ===
) per determinare se un valore è {{jsxref("NaN")}} oppure no, perché entrambe le uguaglianze NaN == NaN
e NaN === NaN
vengono considerate false. Ecco perché è necessaria una funzione isNaN()
.
NaN
Il valore NaN
è generato da un'operazione aritmetica il cui risultato è {{jsxref("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.
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 {{jsxref("Number")}}, questo viene prima trasformato in un numero. Il test per determinare se il parametro è {{jsxref("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 {{jsxref("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()
.
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
Specifica | Stato | Commenti |
---|---|---|
ECMAScript 1st Edition. | Standard | Definizione iniziale. |
{{SpecName('ES5.1', '#sec-15.1.2.4', 'isNaN')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-isnan-number', 'isNaN')}} | {{Spec2('ES6')}} |
{{ CompatibilityTable() }}
Funzionalità | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Supporto di base | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} |
Funzionalità | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Supporto di base | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} |