JavaScript Tester NaN avec isNaN ()


Exemple

window.isNaN()

La fonction globale isNaN() peut être utilisée pour vérifier si une valeur ou une expression isNaN() valeur NaN . Cette fonction (en bref) vérifie d’abord si la valeur est un nombre, si ce n’est pas le convertit (*), puis vérifie si la valeur résultante est NaN . Pour cette raison, cette méthode de test peut entraîner une confusion .

(*) La méthode de "conversion" n'est pas simple, voir ECMA-262 18.2.3 pour une explication détaillée de l'algorithme.

Ces exemples vous aideront à mieux comprendre le comportement 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

Ce dernier est un peu délicat: vérifier si un Array est NaN . Pour ce faire, le constructeur Number() convertit d'abord le tableau en chaîne, puis en nombre; c'est la raison pour laquelle isNaN([]) et isNaN([34]) renvoient toutes les deux false , mais isNaN([1, 2]) et isNaN([true]) renvoient toutes les deux true : parce qu'ils sont convertis en "" , "34" , "1,2" et "true" respectivement. En général, un tableau est considéré comme NaN par isNaN() sauf s'il ne contient qu'un élément dont la représentation sous forme de chaîne peut être convertie en un nombre valide .

6

Number.isNaN()

Dans ECMAScript 6, la fonction Number.isNaN() a été implémentée principalement pour éviter le problème de window.isNaN() de la conversion forcée du paramètre en nombre. Number.isNaN() , en effet, n'essaie pas de convertir la valeur en nombre avant de tester. Cela signifie également que seules les valeurs du type numéro, qui sont également NaN , renvoient true (ce qui signifie essentiellement que Number.isNaN(NaN) ).

De ECMA-262 20.1.2.4 :

Lorsque le Number.isNaN est appelé avec un number argument, les étapes suivantes sont effectuées:

  1. Si Type (number) n'est pas Number, retournez false .
  2. Si le nombre est NaN , retournez true .
  3. Sinon, retournez false .

Quelques exemples:

// 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