Verificar NaN («no es un número») es tan simple como verificar la auto-igualdad en JavaScript.
En JavaScript, el valor especial
NaN
(que significa» no es un número «) se usa para representar el resultado de un cálculo matemático que no se puede representar como un número significativo. – Joshua Clanton en A Drip of JavaScript
El valor especial NaN
aparece en JavaScript cuando Math
las funciones fallan (Math.sqrt(-37)
) o cuando una función que intenta analizar un número falla (parseInt("No integers here")
).
NaN
luego envenena todas las demás funciones matemáticas, lo que lleva a todas las demás operaciones matemáticas que dan como resultado NaN
.
Tenga en cuenta que en JavaScript, la división por 0 devuelve Infinity
, no NaN
:
Este resultado se debe a la forma en que flotante-poi nt está definido, de manera más general que solo Javascript. ¿Por qué? Aproximadamente, porque 1/0 es el límite de 1 / x cuando x se acerca a cero. Y 0/0 no tiene ninguna interpretación razonable, por lo tanto NaN
.
¿Qué es NaN de todos modos?
NaN es una propiedad del objeto global. El valor inicial de NaN es Not-A-Number, el mismo que el valor de Number.NaN. – MDN Docs
Verificar NaN es más difícil de lo que parece
Desafortunadamente, hay dos problemas al intentar verificar NaN
:
- El
typeof NaN
es» número « -
NaN
no es igual a cualquier otro valor en JavaScript
Mira este ejemplo de código:
Entonces, ¿cómo comprobamos si tenemos un valor NaN
que envenene las matemáticas?
Verifica NaN con auto-igualdad
» NaN, y solo NaN, se comparará con los desiguales «. – MDN Docs
En JavaScript, la mejor manera de verificar NaN
es verificando la auto-igualdad utilizando cualquiera de los operadores de igualdad integrados, ==
o ===
.
Porque NaN
no es igual a sí mismo, NaN != NaN
siempre devolverá true
.
Por supuesto, tal NaN
prueba en su código no siempre es legible, por lo que es una buena idea usar un comentario o crear una función contenedora:
No importa si usa !=
o !==
para buscar NaN
.
Verifique NaN con Object.is ()
» El
Object.is()
determina si dos valores son el mismo valor.”- MDN Docs
A diferencia de los operadores de igualdad estrictos y flexibles, el método auxiliar de ES6 Object.is()
no considera NaN
para ser igual a sí mismo:
Por lo tanto, si cambia ===
por Object.is()
, nunca tendrá que preocuparse sobre la comprobación de NaN
de cualquier forma especial. ¡Problema resuelto!
Escribí sobre cómo usar Object.is()
en JavaScript en otro artículo:
Una nota sobre terminología – Object.is()
es una función en la clase Object
global, no la llamo «operador de igualdad» como ==
o ===
.
Por ejemplo, en las pruebas Jest, el método .toBe()
que usa ===
es diferente del método .toEqual()
que usa Object.is()
.
Para terminar aquí, debo mencionar que un JavaScript ES6 Set
, que se usa para encontrar valores únicos, solo conservará una copia de un NaN
valor.
Unas palabras sobre Number .isNan ()
JavaScript moderno ya tiene una implementación para verificar NaN
llamada Number.isNan()
que funciona como usted piensa sería. Por ejemplo:
Tenga en cuenta que Number.isNan()
es diferente de la función global isNan()
, que es una implementación anterior cuyo propósito real es verificar si un valor no se puede convertir en un número.
Aquí está la diferencia, para completar:
-
isNaN()
devolverátrue
si el valor es actualmenteNaN
, o si va a serNaN
después de convertirlo en un número. En otras palabras, si recibe un valor que se puede convertir en un número, isNaN () devolverá falso. -
Number.isNaN()
devolverátrue
solo si el valor es actualmenteNaN
.
Por lo tanto, si admite navegadores antiguos (especialmente Internet Explorer) que no admiten Number.isNan()
, entonces es mejor verificar la auto-igualdad.