BigInt

Trwa tłumaczenie tego artykułu.

BigInt jest wbudowanym obiektem umożliwiającym reprezentowanie całych liczb większch niż 253 - 1, ile wynosi największa liczba, którą JavaScript może faktycznie reprezentować przez prymityw Number, co jest też reprezentowane przez stałą Number.MAX_SAFE_INTEGER. BigInt może być używany do dowolnie dużych liczb całkowitych.

Opis

BigInt jest tworzony przez dodanie n na końcu literału liczby — 10n — lub przez wywołanie funkcji BigInt().

const najwiekszyInt = 9007199254740991n

const tezDuzaLiczba = BigInt(9007199254740991)
// ↪ 9007199254740991n

const duzyString = BigInt("9007199254740991")
// ↪ 9007199254740991n

const duzyHex = BigInt("0x1fffffffffffff")
// ↪ 9007199254740991n

const duzyBin = BigInt("0b11111111111111111111111111111111111111111111111111111")
// ↪ 9007199254740991n

BigInt jest w pewnym sensie podobny do Number ale też różni się od niego w kilku kluczowych sprawach — nie może być używany z metodami wbudowanego obiektu Math, a także nie może być mieszany z instancjami Number w żadnych operacjach; konieczne jest wymuszenie tego samego typu operandów. Należy uważać z wymuszaniem typów w jedną i drugą stronę, w szczególności precyzja BigInt może być utracona przy wymuszonej konwersji do typu Number.

Informacje o typie

Przy sprawdzeniu za pomocą typeof, BigInt zwróci "bigint":

typeof 1n === 'bigint'           // true
typeof BigInt('1') === 'bigint'  // true

Obudowany w Object, BigInt będzie rozważany jako zwykły "obiekt":

typeof Object(1n) === 'object'  // true

Operatory

Z BigIntami (lub BigIntami obudowanymi w obiekty) mogą być używane następujące operatory: : +, *, -, **, %.

Operatory bitowe także są wspierane, z wyjątkiem >>> (przesunięcie w prawo z dopełnieniem zerami), gdyż wszystkie BigInty mają znak.

Niewspierany jest także operator jednoargumentowy (+), aby nie złamać zasad asm.js.

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER) 
// ↪ 9007199254740991n

const maxPlusOne = previousMaxSafe + 1n 
// ↪ 9007199254740992n
 
const theFuture = previousMaxSafe + 2n 
// ↪ 9007199254740993n, this works now!

const multi = previousMaxSafe * 2n 
// ↪ 18014398509481982n

const subtr = multi – 10n 
// ↪ 18014398509481972n

const mod = multi % 10n 
// ↪ 2n

const bigN = 2n ** 54n 
// ↪ 18014398509481984n

bigN * -1n
// ↪ –18014398509481984n

Operator / także działa zgodnie z założeniami z całymi liczbami.

Jako że są to BigInty, a nie BigDecimal, operacja dzielenia będzie zaokroąglała wynik do 0 (zatem można prościej powiedzieć, że nie zwraca ułamkowej części wyniku).

Ułamkowy wynik operacji będzie przycięty, kiedy używany jest  BigInt.

const expected = 4n / 2n
// ↪ 2n

const rounded = 5n / 2n
// ↪ 2n, not 2.5n

Porównania

A BigInt is not strictly equal to a Number, but it is loosely so:

0n === 0
// ↪ false

0n == 0
// ↪ true

A Number and a BigInt may be compared as usual:

1n < 2
// ↪ true

2n > 1
// ↪ true

2 > 2
// ↪ false

2n > 2
// ↪ false

2n >= 2
// ↪ true

They may be mixed in arrays and sorted:

const mixed = [4n, 6, -12n, 10, 4, 0, 0n] 
// ↪  [4n, 6, -12n, 10, 4, 0, 0n]

mixed.sort() 
// ↪ [-12n, 0, 0n, 4n, 4, 6, 10]

Note that comparisons with Object-wrapped BigInts act as with other objects, only indicating equality when the same object instance is compared:

0n === Object(0n)          // false
Object(0n) === Object(0n)  // false

const o = Object(0n) 
o === o                    // true

Conditionals

A BigInt behaves like a Number in cases where:

if (0n) {
  console.log('Hello from the if!') 
} else {
  console.log('Hello from the else!') 
}

// ↪ "Hello from the else!"

0n || 12n
// ↪ 12n

0n && 12n
// ↪ 0n

Boolean(0n)
// ↪ false

Boolean(12n)
// ↪ true

!12n
// ↪ false

!0n
// ↪ true

Konstruktor

BigInt()
Tworzy obiekty BigInt.

Metody statyczne

BigInt.asIntN()
Wraps a BigInt value to a signed integer between -2width-1 and 2width-1 - 1.
BigInt.asUintN()
Wraps a BigInt value to an unsigned integer between 0 and 2width - 1.

Instance methods

BigInt.prototype.toLocaleString()
Returns a string with a language-sensitive representation of this number. Overrides the Object.prototype.toLocaleString() method.
BigInt.prototype.toString()
Returns a string representing the specified object in the specified radix (base). Overrides the Object.prototype.toString() method.
BigInt.prototype.valueOf()
Returns the primitive value of the specified object. Overrides the Object.prototype.valueOf() method.

Rekomendacje w użyciu

Wymuszanie typów

Ponieważ wymuszanie tupów między Number a BigInt może prowadzić do utraty precyzji, zaleca się używanie jedynie typu BigInt, gdy można się spodziewać, że pojawią się wartości przekraczające 253 i nie należy wówczas przeprowadzać konwersji między tymi typami.

Kryptografia

The operations supported on BigInts are not constant time. BigInt is therefore unsuitable for use in cryptography.

Use within JSON

Using JSON.stringify() with any BigInt value will raise a TypeError as BigInt values aren't serialized in JSON by default. However, you can implement your own toJSON method if needed:

BigInt.prototype.toJSON = function() { return this.toString()  }

Instead of throwing, JSON.stringify now produces a string like this:

JSON.stringify(BigInt(1)) 
// '"1"'

Przykłady

Obliczanie liczb pierwszych

// Zwraca true jeśl dany BigInt jest liczbą pierwszą
function isPrime(p) {
  for (let i = 2n; i * i <= p; i++) {
    if (p % i === 0n) return false;
  }
  return true
}

// Przyjmuje BigInt n jako argument, zwraca n-tą liczbę pierwszą jako BigInt
function nthPrime(nth) {
  let maybePrime = 2n
  let prime = 0n
  
  while (nth >= 0n) {
    if (isPrime(maybePrime)) {
      nth--
      prime = maybePrime
    }
    maybePrime++
  }
  
  return prime
}

nthPrime(20n)
// ↪ 73n

Specyfikacje

Specyfikacja
ECMAScript Latest Draft (ECMA-262)
The definition of 'BigInt objects' in that specification.

Wsparcie przeglądarek

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
BigIntChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
BigInt() constructorChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
asIntNChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
asUintNChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
toLocaleStringChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
toStringChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
valueOfChrome Full support 67Edge Full support 79Firefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0

Legend

Full support  
Full support
No support  
No support

Postęp implementacji

Poniższa tabela przedstawia postęp implementacji tej funkcji języka JavaScript, gdyż nie osiągnęła ona jeszcze pełnej stabilności między przeglądarkami. Dane są generowane przez uruchamianie odpowiednich testów tej funkcji w Test262,standrardowym zestawie testów JavaScript, „nocnych wersji” (ang. nightly build) lub ostatnich wydań silnika JavaScript w każdej przeglądarce.

Zobacz też