Tengo una variable x y quiero probar si x está configurada en NaN. ¿Cómo puedo hacer eso?
Mi primer instinto probablemente sea, ya sabes, probarlo, así:
if (x === NaN) { ...Conejo tonto, no, eso sería demasiado fácil. NaN es como NULL en SQL, no es igual a nada, ni siquiera a sí mismo.
Pero mira, hay una función llamada isNaN() -- ¡quizás eso lo haga!
No, por lo que puedo decir, isNaN() no tiene ningún valor.
Por ejemplo, isNaN([""]) correctamente devuelve falso, pero isNaN(["."]) devuelve verdadero. No querrás saber cómo me enteré de este defecto.
¿Cómo hago esto?
Resulta que mi pregunta es un duplicado de esta , pero la respuesta seleccionada es incorrecta. La respuesta correcta tiene un 20% de votos a favor.
Respuesta corta
Para usuarios de ECMAScript-5:
#1 if(x !== x) { console.info('x is NaN.'); } else { console.info('x is NOT a NaN.'); }Para las personas que usan ECMAScript-6:
#2 Number.isNaN(x);Y para fines de coherencia en ECMAScript 5 y 6, también puede usar este relleno polimérico para Number.isNan
#3 //Polyfill from MDN Number.isNaN = Number.isNaN || function(value) { return typeof value === "number" && isNaN(value); } // Or Number.isNaN = Number.isNaN || function(value) { return value !== value; }Nota: prefiero probar usando el n. ° 1, que funciona igual en todos los lugares y tampoco depende del último JS. (Siempre me da el resultado correcto. ¡Sin sorpresas!)
Explicación detallada:
Aquí está nuestro increíble NaN
NaN == NaN; // false NaN === NaN; // false No culpe a JavaScript por esto, se supone que NaN se comporta de esta manera en otros idiomas, lo cual está bien según la lógica de todas las comparaciones que devuelven valores falsos de NaN.
Entonces viene isNaN como nuestro salvador, pero espera, actúa de manera un poco diferente en algunos escenarios como
isNaN(undefined); // true isNaN({}); // true isNaN("lorem ipsum"); // trueTuve algunas caras extrañas al ver los resultados anteriores. Y aquí viene la razón de MDN
Cuando el argumento de la función isNaN no es de tipo Number, el valor primero se coacciona a Number. Luego, el valor resultante se prueba para determinar si es NaN.
Entonces, ¿cómo deberíamos probar NaN para las variables que no son números? yo siempre paso por lo siguiente
if(x !== x) { console.info('Is a NaN'); } else { console.info('Not a NaN'); }ECMAScript-6/JavaScript-2015 Actualizaciones
¿Tenemos algo en ECMAScript-6 para el mismo. Sí, lo hacemos...
Number.isNaN(x); // trueLa implementación de ES6 también será útil para los casos anteriores como
Number.isNaN(undefined); // false Number.isNaN({}); // false Number.isNaN("lorem ipsum"); // false mientras que la función global ECMAScript-5 isNaN resultado true para los casos anteriores, que a veces pueden no alinearse con nuestras expectativas.
La pregunta tiene la respuesta si lees lo suficientemente de cerca. Así es como lo encontré: estaba escribiendo la pregunta y... bingo.
¿Recuerdas cuando escribí " NaN es como NULL en SQL, no es igual a nada, ni siquiera a sí mismo"? Hasta donde yo sé, NaN es el único valor en Javascript con esta propiedad. Por lo tanto puedes escribir:
var reallyIsNaN = function(x) { return x !== x; };