javascript - validate - ¿NaN es igual a NaN?
validate nan javascript (8)
parseFloat("NaN")
devuelve "NaN", pero
parseFloat("NaN") == "NaN"
devuelve falso. Ahora, probablemente sea bueno que devuelva falso, pero no entiendo cómo es esto. ¿Los creadores de JavaScript simplemente hicieron de este un caso especial? Porque de lo contrario no puedo entender cómo esto devuelve falso.
Cuando una función de JavaScript devuelve NaN
, esta no es una cadena literal, sino una propiedad del objeto en el espacio global. No se puede comparar con la cadena "NaN"
.
Ver https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
En ECMAScript 6 Object.is () es una mejora de ===. Este método acepta dos argumentos y devuelve verdadero si los valores son equivalentes. Y los dos valores se consideran equivalentes cuando son del mismo tipo y tienen el mismo valor. Esa es la razón porque console.log (Object.is (NaN, NaN)) -> TRUE
Es un caso especial, NaN es lo único en Javascript que no es igual a sí mismo.
Aunque las otras respuestas sobre cadenas frente al objeto NaN son correctas también.
Estoy trabajando con Google Apps Script y estoy atrapado con ECMA 5. Similar a la respuesta de Electric Coffee, esto es lo que pude descubrir que parece dar una respuesta segura sobre si un valor es realmente NaN
, no si un valor es NaN
pero si es realmente NaN
mismo:
function isThisNaN(x)
{
return isNaN(x) && Object.prototype.toString.call(x) === ''[object Number]'';
}
console.log(isThisNaN(NaN)); // true
jaja. Es gracioso para mí que Object.prototype.toString.call(NaN)
igual a ''[object Number]''
. Mi cerebro novato me dice que NaN
es "No es un número", pero lamentablemente no es tan simple.
EDITAR: Creo que debería haber dicho cómo terminé en este artículo. Fui con la idea de que seguramente una cadena que no contiene un número no sería tratada como un número ... bueno, terminé descubriendo esto:
isNaN(''a''); // true
isNaN('' ''); // false
por lo tanto, aunque '' ''
es una cadena no numérica, aparentemente se engatusa en un número ( 0
).
console.log(Number('' '')); // 0.0
sin embargo...
console.log( 0 ? true : false); // false
console.log('' '' ? true : false); // true
Después de leer más lo entiendo un poco mejor, pero ¡vaya! Qué basura mental para un novato, lol
NaN
es uno de los pocos ejemplos de un objeto que no es igual a sí mismo. De hecho, esta misma propiedad se usa para implementar el método common bool IsNaN(number)
:
function isNaN(x)
{
return x != x;
}
isNaN
funciona para todos los valores que no son números
isNaN(''foo'') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true
Si, sin embargo, desea verificar NaN
específicamente, o evitar la coerción de tipo;
puedes usar Number.isNaN
en Number.isNaN
lugar
Number.isNaN(''foo'') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
Actualización 2
Nuevo en ECMAScript 6 es la función Object.is() . Esto está diseñado para ser una mejora adicional del control ===
. Una de las ventajas de esta nueva función es que Object.is(NaN, NaN)
ahora devolverá verdadero. Si puede utilizar ECMAScript 6 , esta sería la solución más legible y consistente para usted.
Original
La forma correcta de verificar esto sería:
isNaN(parseInt(variable))
Si lo que está comprobando es un NaN, esa función volverá a ser verdadera. Este método está integrado en las especificaciones de JavaScript.
Usando jQuery
jQuery incorporó su propia función isNaN
originalmente para ayudar a contrarrestar algunas discrepancias entre los navegadores, y agregar algunas comprobaciones adicionales para que su versión se pueda usar en lugar de la de VanillaJS.
Actualización para jQuery
Después de jQuery 1.7, cambiaron esta función a $.isNumeric()
.
Si isNaN()
un vistazo a esta pregunta sobre el desbordamiento de la pila , encontrarás muchas veces donde isNaN()
devuelve lo que intuitivamente se consideraría una respuesta "incorrecta", pero es correcta según la especificación.
Una de las razones principales para evitar el vainilla isNaN()
es que null
devolverá false
, haciéndolo pensar que es un número. Sin embargo, la función jQuery cubre una gama mucho más amplia de resultados intuitivos.
De su documentación:
A partir de jQuery 3.0 $ .isNumeric () devuelve verdadero solo si el argumento es de tipo número, o si es de tipo cadena y se puede forzar en números finitos. En todos los demás casos, devuelve falso.
- Cuando
Number
(devuelto por ParseFloat) se compara constring
string
convertido aNumber
-
NaN
no es igual a ningún otro objeto (incluidoNaN
)
NaN==NaN
. Es falso por segunda regla.