JavaScript Prueba de NaN usando isNaN ()


Ejemplo

window.isNaN()

La función global isNaN() se puede usar para verificar si un determinado valor o expresión se evalúa como NaN . Esta función (en resumen) primero verifica si el valor es un número, si no intenta convertirlo (*), y luego verifica si el valor resultante es NaN . Por esta razón, este método de prueba puede causar confusión .

(*) El método de "conversión" no es tan simple, ver ECMA-262 18.2.3 para una explicación detallada del algoritmo.

Estos ejemplos te ayudarán a comprender mejor el comportamiento de 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

Este último es un poco complicado: comprobar si una Array es NaN . Para hacer esto, el constructor Number() primero convierte la matriz a una cadena, luego a un número; esta es la razón por la que isNaN([]) y isNaN([34]) devuelven false , pero isNaN([1, 2]) y isNaN([true]) devuelven true : porque se convierten a "" , "34" , "1,2" y "true" respectivamente. En general, una matriz se considera NaN por isNaN() menos que solo contenga un elemento cuya representación de cadena pueda convertirse en un número válido .

6

Number.isNaN()

En ECMAScript 6, la función Number.isNaN() se implementó principalmente para evitar el problema de window.isNaN() de convertir a la fuerza el parámetro en un número. Number.isNaN() , de hecho, no intenta convertir el valor en un número antes de la prueba. Esto también significa que solo los valores del número de tipo, que también son NaN , devuelven true (lo que básicamente significa solo Number.isNaN(NaN) ).

Desde ECMA-262 20.1.2.4 :

Cuando se llama a Number.isNaN con un number argumento, se toman los siguientes pasos:

  1. Si el Tipo (número) no es Número, devuelva false .
  2. Si el número es NaN , devuelve true .
  3. De lo contrario, devuelve false .

Algunos ejemplos:

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