Cómo verificar NaN en JavaScript

Verificar NaN («no es un número») es tan simple como verificar la auto-igualdad en JavaScript.

Dr. Derek Austin 🥳

Seguir

15 de septiembre de 2019 · 4 minutos de lectura

Foto de Rattap en Unsplash

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.

Foto de Chris Barbalis en Unsplash

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

Foto de Andrew Buchanan en Unsplash

Verificar NaN es más difícil de lo que parece

Desafortunadamente, hay dos problemas al intentar verificar NaN:

  1. El typeof NaN es» número «
  2. 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?

Foto de Wolfgang Rottmann en Unsplash

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.

Foto de Erik Mclean en Unsplash

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.

Foto de Tony Hand en Unsplash

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 actualmente NaN, o si va a ser NaN 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 actualmente NaN.

Por lo tanto, si admite navegadores antiguos (especialmente Internet Explorer) que no admiten Number.isNan(), entonces es mejor verificar la auto-igualdad.

Foto de Nick Hillier en Unsplash

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *