JavaScript BigInt


Innehållsförteckning

    Visa innehållsförteckning

JavaScript BigInt-variabler används för att lagra stora heltalsvärden som är för stora för att representeras av ett vanligt JavaScript nummer.

JavaScript-heltalsnoggrannhet

JavaScript-heltal är endast korrekta upp till 15 siffror:

Heltalsprecision

let x = 999999999999999;
let y = 9999999999999999;

Prova själv →

<!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>


I JavaScript lagras alla nummer i ett 64-bitars flyttalsformat (IEEE 754-standard).

Med denna standard kan stort heltal inte representeras exakt och kommer att avrundas.

På grund av detta kan JavaScript bara säkert representera heltal:

Upp till 9007199254740991 +(253-1)

och

Ner till -9007199254740991 -(253-1).

Heltalsvärden utanför detta intervall förlorar precision.


Hur man skapar en BigInt

För att skapa en BigInt, lägg till n i slutet av ett heltal eller anrop BigInt():

Exempel

let x = 9999999999999999;
let y = 9999999999999999n;

Prova själv →

<!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)

Prova själv →

<!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>



BigInt: En ny JavaScript-datatyp

JavaScript-typen typ en BigInt är "bigint":

Exempel

let x = BigInt(999999999999999);
let type = typeof x;

Prova själv →

<!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 är den andra numeriska datatypen i JavaScript (efter Nummer).

Med BigInt är det totala antalet datatyper som stöds i JavaScript 8:

1. Sträng
2. Nummer
3. Bigint
4. Boolean
5. Odefinierat
6. Null
7. Symbol
8. Objekt


BigInt-operatörer

Operatörer som kan användas på ett JavaScript nummer kan också användas på en BigInt.

Exempel på BigInt multiplikation

let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

Prova själv →

<!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>

Anteckningar

Aritmetik mellan en BigInt och ett nummer är inte tillåtet (typ omvandlingsförlustinformation).

Osignerat högerskift (>>>) kan inte göras på en BigInt (den har ingen fast bredd).


BigInt decimaler

En BigInt kan inte ha decimaler.

Exempel på BigInt Division

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;

Prova själv →

<!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 Hex, Octal och Binary

BigInt kan också skrivas i hexadecimal, oktal eller binär notation:

BigInt Hex Exempel

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

Prova själv →

<!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>

Precision Nyfikenhet

Avrundning kan äventyra programsäkerheten:

MAX_SAFE_INTEGER Exempel

9007199254740992 === 9007199254740993; // is true !!!

Prova själv →

<!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>

Webbläsarstöd

BigInt stöds i alla webbläsare sedan september 2020:

Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
May 2018 Jan 2020 Jul 2019 Sep 2020 Jun 2018


Minsta och maximala säkra heltal

ES6 lade till max- och min-egenskaper till Number-objektet:

  • MAX_SAFE_INTEGER

  • MIN_SAFE_INTEGER

MAX_SAFE_INTEGER Exempel

let x = Number.MAX_SAFE_INTEGER;

Prova själv →

<!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>

MIN_SAFE_INTEGER Exempel

let x = Number.MIN_SAFE_INTEGER;

Prova själv →

<!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>

Nya nummermetoder

ES6 lade också till 2 nya metoder till Number-objektet:

  • Number.isInteger()

  • Number.isSafeInteger()


Number.isInteger()-metoden

Metoden Number.isInteger() returnerar true om argumentet är ett heltal.

Exempel: isInteger()

Number.isInteger(10);
Number.isInteger(10.5);

Prova själv →

<!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>

Number.isSafeInteger()-metoden

Ett säkert heltal är ett heltal som exakt kan representeras som ett dubbelt precisionstal.

Metoden Number.isSafeInteger() returnerar true om argumentet är ett säkert heltal.

Exempel ärSafeInteger()

Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);

Prova själv →

<!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>

Säkra heltal är alla heltal från -(253 - 1) till +(253 - 1).
Detta är säkert: 9007199254740991. Det här är inte säkert: 9007199254740992.