JavaScript Test per NaN utilizzando isNaN ()


Esempio

window.isNaN()

La funzione globale isNaN() può essere utilizzata per verificare se un determinato valore o espressione viene valutata in NaN . Questa funzione (in breve) verifica innanzitutto se il valore è un numero, se non tenta di convertirlo (*), quindi controlla se il valore risultante è NaN . Per questo motivo, questo metodo di prova può causare confusione .

(*) Il metodo di "conversione" non è così semplice, vedi ECMA-262 18.2.3 per una spiegazione dettagliata dell'algoritmo.

Questi esempi ti aiuteranno a capire meglio il comportamento di isNaN() :

isNaN(NaN);          // true
isNaN(1);            // false: 1 is a number
isNaN(-2e-4);        // false: -2e-4 is a number (-0.0002) in scientific notation
isNaN(Infinity);     // false: Infinity is a number
isNaN(true);         // false: converted to 1, which is a number
isNaN(false);        // false: converted to 0, which is a number
isNaN(null);         // false: converted to 0, which is a number
isNaN("");           // false: converted to 0, which is a number
isNaN(" ");          // false: converted to 0, which is a number
isNaN("45.3");       // false: string representing a number, converted to 45.3
isNaN("1.2e3");      // false: string representing a number, converted to 1.2e3
isNaN("Infinity");   // false: string representing a number, converted to Infinity
isNaN(new Date);     // false: Date object, converted to milliseconds since epoch
isNaN("10$");        // true : conversion fails, the dollar sign is not a digit
isNaN("hello");      // true : conversion fails, no digits at all
isNaN(undefined);    // true : converted to NaN
isNaN();             // true : converted to NaN (implicitly undefined)
isNaN(function(){}); // true : conversion fails
isNaN({});           // true : conversion fails
isNaN([1, 2]);       // true : converted to "1, 2", which can't be converted to a number

Quest'ultimo è un po 'complicato: verificare se una Array è NaN . Per fare ciò, la funzione di costruzione Number() converte prima l'array in una stringa, quindi in un numero; questo è il motivo per cui isNaN([]) e isNaN([34]) restituiscono entrambi false , ma isNaN([1, 2]) e isNaN([true]) entrambi restituiscono true : perché vengono convertiti in "" , "34" , "1,2" e "true" rispettivamente. In generale, un array è considerato NaN per isNaN() meno che non contenga un solo elemento la cui rappresentazione di stringa possa essere convertita in un numero valido .

6

Number.isNaN()

In ECMAScript 6, la funzione Number.isNaN() è stata implementata principalmente per evitare il problema di window.isNaN() di convertire forzatamente il parametro in un numero. Number.isNaN() , infatti, non tenta di convertire il valore in un numero prima del test. Ciò significa anche che solo i valori del numero di tipo, che sono anche NaN , restituiscono true (che in pratica significa solo Number.isNaN(NaN) ).

Da ECMA-262 20.1.2.4 :

Quando viene chiamato Number.isNaN con un number argomento, vengono Number.isNaN i seguenti passi:

  1. Se Type (numero) non è Number, restituisce false .
  2. Se il numero è NaN , restituisce true .
  3. Altrimenti, restituisci false .

Qualche esempio:

// The one and only 
Number.isNaN(NaN);          // true

// Numbers
Number.isNaN(1);            // false
Number.isNaN(-2e-4);        // false
Number.isNaN(Infinity);     // false

// Values not of type number
Number.isNaN(true);         // false
Number.isNaN(false);        // false
Number.isNaN(null);         // false
Number.isNaN("");           // false
Number.isNaN(" ");          // false
Number.isNaN("45.3");       // false
Number.isNaN("1.2e3");      // false
Number.isNaN("Infinity");   // false
Number.isNaN(new Date);     // false
Number.isNaN("10$");        // false
Number.isNaN("hello");      // false
Number.isNaN(undefined);    // false
Number.isNaN();             // false
Number.isNaN(function(){}); // false
Number.isNaN({});           // false
Number.isNaN([]);           // false
Number.isNaN([1]);          // false
Number.isNaN([1, 2]);       // false
Number.isNaN([true]);       // false