Los números son un tipo primitivo en JavaScript, pero el simple uso de typeof no diferenciará los números de NaN o Infinito.
.
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 NaN
Infinity
, 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
.
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.
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
:
.
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.

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.
.
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:
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 ===
.
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.»
.
¿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.
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.
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: