Cómo comprobar un número en JavaScript

Los números son un tipo primitivo en JavaScript, pero el simple uso de typeof no diferenciará los números de NaN o Infinito.

Sep 23, 2019 – 6 min read

.

Foto de Alex Chambers en Unsplash

Es útil saber cómo comprobar si un valor es de tipo primitivo número, ya que JavaScript es un lenguaje de tipado dinámico.

La forma más sencilla de comprobar un número es utilizando typeof, que devolverá la cadena "number" para cualquier valor del tipo primitivo número, incluyendo NaNInfinity, y -Infinity.

Un ejemplo en el que un número podría aparecer como otro tipo, indicando un error en mi código, sería en el análisis sintáctico de la moneda:

En este caso, sabría que me olvidé de parsear la cadena en un número cuando me devuelve el valor de «string» desde typeof.

.
Foto de Samuel Zeller en Unsplash

Si uso parseFloat() para comprobar el valor de la moneda, pero me olvidé de quitar el símbolo de la moneda, obtengo un análisis fallido y un resultado extraño:

Oh, no. En este caso, parece que typeof no está funcionando como esperaba – porque los valores NaN se consideran números en JavaScript.

Foto de Gemma Evans en Unsplash

Cuando la palabra clave typeof devuelve «number»

Una solución obvia para comprobar el tipo primitivo number es utilizar la palabra clave typeof, como he mostrado arriba.

Pero typeof es una solución incompleta, debido a dos valores especiales en JavaScript: NaN («No es un número») y Infinity.

Para mi ejemplo de la moneda, sé que tengo un error si mi valor monetario es NaN o Infinity, pero typeof devuelve "number" para estos dos valores.

Tal vez mi entrada fue escrita usando un símbolo de moneda, y simplemente traté de usar parseFloat() para capturar el valor. Eso resultaría en NaN:

.

Foto de Timo Kaiser en Unsplash

Una función isNumber() personalizada

Arobust, personalizada isNumber() función utilizaría typeof para comprobar el tipo primitivo, comprobar los valores NaN y comprobar Infinity:

O, en el caso de que se confíe en que NaN y Infinity no van a salir, con comprobar que typeof==="number" sería suficiente.

.
Foto de 🇨🇭 Claudio Schwarz | @purzlbaum en Unsplash

El one-liner

Me encantan los one-liners. Creo que hay que documentarlos con comentarios, pero creo que en realidad son realmente útiles, no son sólo fantasía.

Aquí está el one-liner de cómo comprobar un número en JavaScript:

Pero, hay una mejor manera de comprobar un número finito en JavaScript – la función de ayuda Number.isFinite() tiene el mismo comportamiento que la función personalizada isNumber() que escribí. Incluyo un ejemplo en la siguiente sección.

.

Foto de Bernard Hermant en Unsplash

La forma más sencilla de comprobar un número: Number.isFinite()

En realidad no es necesario escribir funciones personalizadas para comprobar un número, aunque es una forma instructiva de recordar que los valores de JavaScript Infinity-Infinity, y NaN son todos del tipo primitivo número.

«El método Number.isFinite() determina si el valor pasado es un número finito.» – MDN Docs

El método Number.isFinite() devolverá true para números finitos, y false para Infinity-Infinity, y NaN – exactamente lo que queremos:

También existe la función global isFinite(), que realizará la coerción de tipos (como coaccionar cadenas a números), como se muestra arriba.

Discuto estos métodos en profundidad en mi artículo sobre Infinity en La puesta en marcha:

Foto de Bogomil Mihaylov en Unsplash

Comprobar si una variable es un entero

Para comprobar si la variable A es un entero podría utilizar el operador de igualdad suelto == para ver si el valor analizado es igual a sí mismo.

El siguiente fragmento de código da un ejemplo de cómo comprobar un entero:

Usando typeof se diferenciaría una cadena que está siendo coaccionada en un número de un número real, al igual que el operador de igualdad estricta ===.

Foto de Markus Spiske en Unsplash

Sacar los símbolos de la moneda

Para una mejor, función más robusta, podría querer quitar los símbolos monetarios (como el signo de dólar y cualquier coma) primero.

Examinar a fondo el dinero usando expresiones regulares en JavaScript está más allá del alcance de este artículo, pero este código elimina $ y , antes de analizarlo:

Nota que las funciones globales parseInt() y parseFloat() coaccionarán los valores a las cadenas, si es necesario, y devolverán NaN si la coerción falla.

También existen las funciones Numbers.parseInt() y Number.parseFloat(), que tienen el mismo comportamiento exacto.

Según los MDN Docs, esas funciones duplicadas se añadieron a ECMAScript 2015 para la «modularización del propósito de los globales.»

.

Foto de Toa Heftiba en Unsplash

¿Tiene JavaScript realmente enteros separados?

No, JavaScript sólo tiene un tipo de número, que se representa internamente como una representación de punto flotante de 64 bits.

Ese punto flotante es el tipo de datos primitivo number, y también hay un tipo llamado BigInt que se puede utilizar para números arbitrariamente grandes.

Las funciones globales parseInt() y parseFloat() difieren en lo que esperan y en la salida, pero no porque haya realmente tipos enteros y de punto flotante separados en JavaScript.

Foto de Volkan Olmez en Unsplash

Conclusión

Comprobar un número en JavaScript no es especialmente complicado – typeof funciona básicamente como debería, siempre y cuando uno sea consciente de que tanto NaN como Infinity tienen el número typeof.

La forma más sencilla de comprobar que se trata de un número finito (es decir no NaN o Infinity) en JavaScript es utilizando Number.isFinite(), que no coacciona los valores a los números, o el global isFinite(), que sí realiza la coacción de tipo.

La comprobación de un número entero implica específicamente el uso de la función parseInt(), seguido de la comparación del valor analizado con sí mismo utilizando == (que coaccionará el tipo de valores no numéricos, como las cadenas a números) o === (que sólo devolverá true si ambos valores son números).

Bajo el capó, los enteros y los flotantes son todos iguales: JavaScript sólo tiene un tipo de número, el tipo primitivo number.

Foto de K. Mitch Hodge on Unsplash

Lectura adicional

  • La función Number.isInteger() no coacciona cadenas a números:
  • Sumit Kumar Pradhan escribió sobre la comprobación de números en Dev.to:
  • Chris Ferdinandi discutiendo el análisis de números en su blog vanilla JS:
  • La expresión regular ^+(\.{1,2})?$ coincide con dinero:
  • Sarah Dayan escribió sobre el análisis de dinero en JavaScript en frontstuff:

Foto de Alejandro Ortiz en Unsplash

Deja una respuesta

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