Las variables JavaScript BigInt
se utilizan para almacenar valores enteros grandes que son demasiado grandes para ser representados por un Número
de JavaScript normal.
Los enteros de JavaScript solo tienen una precisión de hasta 15 dígitos:
let x = 999999999999999;
let y = 9999999999999999;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Integer Precision</h2>
<p>Integers (numbers without a period or exponent notation) are accurate up to 15 digits:</p>
<p id="demo"></p>
<script>
let x = 999999999999999;
let y = 9999999999999999;
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
En JavaScript, todos los números se almacenan en un formato de punto flotante de 64 bits (estándar IEEE 754).
Con este estándar, los números enteros grandes no se pueden representar exactamente y se redondearán.
Debido a esto, JavaScript sólo puede representar números enteros de forma segura:
Hasta 9007199254740991 +(253-1)
y
Hasta -9007199254740991 -(253-1).
Los valores enteros fuera de este rango pierden precisión.
Para crear un BigInt
, agregue n al final de un número entero o llame
let x = 9999999999999999;
let y = 9999999999999999n;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Integer and BigInt</h2>
<p id="demo"></p>
<script>
let x = 9999999999999999;
let y = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
let x = 1234567890123456789012345n;
let y = BigInt(1234567890123456789012345)
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Create a BigInt</h2>
<p id="demo"></p>
<script>
let x = 123456789012345678901234567890n;
let y = BigInt("123456789012345678901234567890");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
El tipode
de JavaScript de un BigInt
es "bigint":
let x = BigInt(999999999999999);
let type = typeof x;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>BigInt typeof</h2>
<p>The typeof a BigInt is:</p>
<p id="demo"></p>
<script>
let x = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = typeof x;
</script>
</body>
</html>
BigInt
es el segundo tipo de datos numéricos en JavaScript (después de Número
).
Con BigInt
el número total de tipos de datos admitidos en JavaScript es 8:
1. Cadena
2. Número
3. Bigint
4. Booleano
5. Indefinido
6. Nulo
7. Símbolo
8. Objeto
Operadores que se pueden utilizar en un Número
de JavaScript También se puede utilizar en un BigInt
.
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>BigInt Multiply</h2>
<p>Operators that can be used a Number can be used on a BigInt.</p>
<p id="demo"></p>
<script>
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
document.getElementById("demo").innerHTML = z;
</script>
</body>
</html>
Aritmética entre un BigInt
y un Número
no está permitido (la conversión de tipo pierde información).
El desplazamiento a la derecha sin signo (>>>) no se puede realizar en un BigInt
(no tiene un ancho fijo).
Un BigInt
no puede tener decimales.
let x = 5n;
let y = x / 2;
// Error: Cannot mix BigInt and other types, use explicit conversion.
let x = 5n;
let y = Number(x) / 2;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>BigInt Divide</h2>
<p>A BigInt can not have decimals.</p>
<p>Cannot mix BigInt and other types, use explicit conversions.</p>
<p id="demo"></p>
<script>
let x = 5n;
let y = Number(x) / 2;
document.getElementById("demo").innerHTML = y;
</script>
</body>
</html>
BigInt
también se puede escribir en notación hexadecimal, octal o binaria:
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>Hex, Octal and Binary</h2>
<p id="demo"></p>
<script>
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
document.getElementById("demo").innerHTML = hex + "<br>" + oct + "<br>" + bin;
</script>
</body>
</html>
El redondeo puede comprometer la seguridad del programa:
9007199254740992 === 9007199254740993; // is true !!!
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Numbers</h1>
<h2>Integer Precision</h2>
<p>Is 9007199254740992 equal to 9007199254740993?</p>
<p id="demo"></p>
<script>
let x = 9007199254740992 === 9007199254740993;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
BigInt
es compatible con todos los navegadores desde septiembre de 2020:
Chrome 67 | Edge 79 | Firefox 68 | Safari 14 | Opera 54 |
May 2018 | Jan 2020 | Jul 2019 | Sep 2020 | Jun 2018 |
ES6 agregó propiedades máximas y mínimas al objeto Número:
let x = Number.MAX_SAFE_INTEGER;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h2>Number Object Properties</h2>
<p>MAX_SAFE_INTEGER</p>
<p id="demo"></p>
<script>
let x = Number.MAX_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
let x = Number.MIN_SAFE_INTEGER;
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h2>Number Object Properties</h2>
<p>MIN_SAFE_INTEGER</p>
<p id="demo"></p>
<script>
let x = Number.MIN_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
ES6 también agregó 2 nuevos métodos al objeto Número:
Number.isInteger()
Number.isSafeInteger()
El método Number.isInteger()
devuelve true
si el argumento es un número entero.
Number.isInteger(10);
Number.isInteger(10.5);
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>The isInteger() Method</h2>
<p>The isInteger() method returns true if the argument is an integer.</p>
<p>Otherwise it returns false.</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number.isInteger(10) + "<br>" + Number.isInteger(10.5);
</script>
</body>
</html>
Un número entero seguro es un número entero que se puede representar exactamente como un número de doble precisión.
El método Number.isSafeInteger()
devuelve true
si el argumento es un entero seguro.
Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);
Pruébelo usted mismo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>The isSafeInteger() Method</h2>
<p>The isSafeInteger() method returns true if the argument is a safe integer.</p>
<p>Otherwise it returns false.</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number.isSafeInteger(10) + "<br>" + Number.isSafeInteger(12345678901234567890);
</script>
</body>
</html>
Los enteros seguros son todos los números enteros desde -(253 - 1) hasta +(253 - 1).
Esto es seguro: 9007199254740991. Esto no es seguro: 9007199254740992.