Los números en JavaScript tienen un límite, no sé cuál, pero tienen un límite y si se sobrepasa, se experimentan comportamientos raros. Es por ello que no podemos tener números muy grandes, porque los mismos pueden ocasionar problemas de contabilidad y esas cosas.
Pero no nos podemos quedar así, y es por eso que ha llegado el tipo de dato BigInt en JavaScript (seguramente también está el BigFloat o algo así) que permite tener enteros muy grandes (algo así como la maravillosa librería GMP programada en C)
En este post veremos cómo usar el tipo de dato BigInt en JavaScript, así como sus ventajas y algunos usos. Gracias a BigInt podemos hacer aritmética sin preocuparnos por los límites.
BigInt en JavaScript
Lo bueno de este tipo de dato BigInt es que permite operar con él como si fuera un dato nativo (de hecho es un tipo de dato nativo). Cuando usamos una librería, su uso sería algo como:
let numero = BigInt(1);
Bueno, de hecho su uso sí es así realmente, pero calma, que vamos poco a poco. Lo que quise decir es que si quisiéramos sumar usando una librería, se haría esto:
numero.add(1500);
Eso sumaría a numero el valor de 1500, pero no podríamos hacer algo así:
numero + 1500;
Porque sería inválido. Pues bien, este tipo de dato BigInt sí permite operar normalmente, así con sumas, restas y esas cosas como si se tratara de un dato nativo.
La desventaja de BigInt es que si el navegador no lo soporta, no hay un polyfill tan fácil de implementar, pues un polyfill no puede cambiar la forma en la que los operadores como +
, -
, *
y /
trabajan.
Pero bueno, ya estamos casi en 2019 y es hora de forzar al usuario a que se actualice. En fin, sí existe un polyfill pero se usa llamando a métodos como add
en lugar de sumar normalmente, pruébalo si gustas.
¿Por qué BigInt?
Porque JavaScript trata a todos los números con la misma precisión. Aparte de ello, hay límites que tienen comportamientos inesperados cuando son sobrepasados. Veamos la siguiente imagen:
Ok, el máximo es 9007199254740991
y si le aumentamos uno, sería 9007199254740992
. Pero si le aumentamos 2, debería ser 9007199254740993
, en cambio, en la consola sale 9007199254740992
.
Lo que trato de decir es que si le sumamos 1 o 2, el resultado es el mismo. Esto es potencialmente peligroso, así que mejor usamos BigInt como veremos más abajo.
Usar BigInt en JavaScript
Podemos definir una variable de tipo BigInt de dos maneras. Llamando a la función global BigInt
o agregando el sufijo n
a un número. De las siguientes cosas, ambas son válidas:
let numero = BigInt(10);
let numero = 10n;
Y luego ya podemos operar normalmente, aunque hay que tener cuidado, porque no podemos sumar un BigInt con un simple número. Si, por ejemplo, ejecutamos:
10+20n
Genera un error:
Pero podemos convertir fácilmente de la siguiente manera:
BigInt(10) + 20n;
Aunque en realidad podríamos haber hecho lo siguiente:
10n+20n;
Puede que el primer número sea una variable, y una variable no puede ser sufijada, por eso se llama a BigInt
.
Números sin límite en JavaScript
Ahora podemos ir más allá de Number.MAX_SAFE_INTEGER
y operar normalmente. Recuerda el ejemplo de arriba, ahora hagamos esto pero con BigInt:
Los resultados son correctos, y eso fue un ejemplo sencillo; porque podemos sumar más y más. O restar, multiplicar y dividir, todo eso que hacemos con datos numéricos primitivos.
Ventajas
Las ventajas son que ahora podemos operar con enteros con y sin signo más allá del límite. De esta manera, no debemos preocuparnos por desbordamientos o comportamientos inesperados.
La mala noticia es que no todos los navegadores tienen soporte para BigInt, pero con el tiempo eso cambiará.
Conclusiones
Por el momento no es seguro usar a BigInt, hay que esperar un poco más. En Node.JS todavía no hay soporte. Tampoco cuenta con ello Firefox ni Edge, sólo Chrome.
BigInt traerá grandes cambios a JavaScript, pero falta que sea aprobado e implementado en todos los lugares.
Y antes de que digan que Chrome quiere dominar al mundo (y si lo domina, se lo merece) esto es una propuesta de EcmaScript, algo así como quien regula todo de JavaScript. No es culpa de Chrome tener las cosas más novedosas.