number - ¿Cómo se prueba para NaN en JavaScript?
parseint jquery nan (2)
Tengo una variable x y quiero probar si x está configurado en NaN. ¿Cómo puedo hacer eso?
Mi primer instinto es probablemente, 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 a sí mismo.
Pero mira, hay una función llamada
isNaN()
- ¡quizás eso lo haga!
No, hasta donde puedo decir,
isNaN()
tiene
isNaN()
valor.
Por ejemplo,
isNaN([""])
devuelve correctamente false, pero
isNaN(["."])
Devuelve true.
No quieres 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% más de votos a favor.
La pregunta tiene la respuesta si lees lo suficiente. Así lo encontré: estaba escribiendo la pregunta y ... bingo.
¿Recuerdas cuando escribí "
NaN
es como NULL en SQL, no es igual a nada, ni a sí mismo"?
Hasta donde sé,
NaN
es el único valor en Javascript con esta propiedad.
Por lo tanto puedes escribir:
var reallyIsNaN = function(x) {
return x !== x;
};
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 polyfill 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 no depende del último JS también. (Siempre me da el resultado correcto. ¡Sin sorpresas!)
Explicación detallada:
Aquí está nuestro increíble NaN
NaN == NaN; // false
NaN === NaN; // false
Por favor, no culpe a
JavaScript
por esto, es NaN el que se supone que debe comportarse de esta manera también en otros idiomas, lo cual está bien según el
razonamiento de todas las comparaciones que devuelven valores falsos de NaN
Entonces viene
isNaN
como nuestro salvador, pero espera, actúa de manera poco diferente en algunos escenarios como
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
Tuve 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 del tipo Número, el valor se convierte primero en un Número. 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? Siempre voy por lo siguiente
if(x !== x) {
console.info(''Is a NaN'');
}
else {
console.info(''Not a NaN'');
}
Actualizaciones de ECMAScript-6 / JavaScript-2015
¿Tenemos algo en ECMAScript-6 para lo mismo? Sí lo hacemos ...
Number.isNaN(x); // true
La 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
salidas de
isNaN
en
true
para los casos anteriores, que a veces pueden no alinearse con nuestras expectativas.