BigInt

BigInt є вбудованим об'єктом, який надає можливість відображати неушкодженими числа, більші за 253 - 1, тобто, за найбільше число, яке може надійно відобразити JavaScript за допомогою примітиву Number та яке передається константою Number.MAX_SAFE_INTEGER. BigInt може використовуватись для довільно великих цілих чисел.

Опис

BigInt утворюється додаванням n у кінець цілочисельного літералу — 10n — або викликом функції BigInt().

const theBiggestInt = 9007199254740991n

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

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

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

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

Тип BigInt певними рисами схожий на Number, але також відрізняється у кількох ключових моментах — він не може використовуватись з методами вбудованого об'єкта Math та не може змішуватись з екземплярами Number у операціях; вони мають бути приведені до одного типу. Однак, будьте обережні, перетворюючи значення туди й назад, бо BigInt може втратити точність при перетворенні на Number.

Інформація про тип

При перевірці на typeof, BigInt видасть "bigint":

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

При загортанні у Object, BigInt вважатиметься звичайним типом "object":

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

Оператори

Наступні оператори можна використовувати з BigInt (або з загорнутими у об'єкт BigInt): +, *, -, **, %.

Бітові оператори також підтримуються, окрім >>> (правий зсув із заповненням нулями), оскільки числа BigInt мають знак.

Також не підтримується унарний оператор (+), щоб не ламати asm.js.

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

const maxPlusOne = previousMaxSafe + 1n 
// ↪ 9007199254740992n
 
const theFuture = previousMaxSafe + 2n 
// ↪ 9007199254740993n, тепер це працює!

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

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

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

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

bigN * -1n
// ↪ –18014398509481984n

Оператор / також працює, як і очікується, з повними числами.

Однак, оскільки це BigInt, а не BigDecimal, ця операція округлить результат в бік 0 (іншими словами, вона не поверне десяткових знаків).

Дробова частина результату операції буде обрізана при використанні з BigInt.

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

const rounded = 5n / 2n
// ↪ 2n, а не 2.5n

Порівняння

BigInt не є строго рівним Number, але є нестрого рівним:

0n === 0
// ↪ false

0n == 0
// ↪ true

Number та BigInt можна порівнювати звичайним чином:

1n < 2
// ↪ true

2n > 1
// ↪ true

2 > 2
// ↪ false

2n > 2
// ↪ false

2n >= 2
// ↪ true

Їх можна змішувати у масивах та сортувати:

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

mixed.sort() // звичайна поведінка при сортуванні
// ↪  [ -12n, 0, 0n, 10, 4n, 4, 6 ]

mixed.sort((a, b) => a - b) 
// не спрацює, оскільки віднімання не працює при змішуванні типів
// TypeError: can't convert BigInt to number

// сортування з потрібним порівнянням чисел
mixed.sort((a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0)
// ↪  [ -12n, 0, 0n, 4n, 4, 6, 10 ]

Зауважте, що порівняння чисел BigInt, загорнутих у об'єкт, працюють так само, як з іншими об'єктами, вони рівні тільки при порівнянні одного й того ж самого об'єкта:

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

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

Умовні конструкції

BigInt поводиться так само, як і Number, у тих випадках, де:

if (0n) {
  console.log('Привіт з if!') 
} else {
  console.log('Привіт з else!') 
}

// ↪ "Привіт з else!"

0n || 12n
// ↪ 12n

0n && 12n
// ↪ 0n

Boolean(0n)
// ↪ false

Boolean(12n)
// ↪ true

!12n
// ↪ false

!0n
// ↪ true

Конструктор

BigInt()
Створює нове значення bigint.

Статичні методи

BigInt.asIntN()
Обертає значення BigInt до цілого числа зі знаком у діапазоні між -2width-1 та 2width-1 - 1.
BigInt.asUintN()
Обертає значення BigInt до беззнакового цілого числа у діапазоні між 0 та 2width - 1.

Методи екземплярів

BigInt.prototype.toLocaleString()
Повертає рядок, який відображає число у відповідності до налаштувань мови. Заміщує метод Object.prototype.toLocaleString().
BigInt.prototype.toString()
Вертає рядкове представлення вказаного об'єкта з вказаною основою системи числення. Заміщує метод Object.prototype.toString().
BigInt.prototype.valueOf()
Вертає загорнуте примітивне значення вказаного об'єкта. Заміщує метод Object.prototype.valueOf().

Рекомендації щодо використання

Перетворення типів

Оскільки перетворення між Number та BigInt можуть призвести до втрати точності, рекомендується використовувати лише BigInt, коли очікуються значення, більші за 253, і не переключатись між двома типами.

Криптографія

Операції, що підтримуються на об'єктах BigInt, не є операціями сталого часу. Таким чином, об'єкти BigInt непридатні для використання у криптографії.

Використання у JSON

Використання JSON.stringify() з будь-яким значенням BigInt спричинить TypeError, оскільки значення BigInt не серіалізуються у JSON за замовчуванням. Однак, ви можете за необхідності реалізувати свій власний метод toJSON:

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

Тепер JSON.stringify, замість викидання винятку, повертає ось такий рядок:

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

Приклади

Обчислення простих чисел

// Повертає true, якщо передане значення BigInt є простим числом
function isPrime(p) {
  for (let i = 2n; i * i <= p; i++) {
    if (p % i === 0n) return false;
  }
  return true
}

// Приймає BigInt в якості аргументу, повертає n-не просте число як 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

Специфікації

Специфікація
ECMAScript (ECMA-262)
The definition of 'BigInt objects' in that specification.

Сумісність з веб-переглядачами

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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung 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 Full support 14WebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS Full support 14Samsung Internet Android Full support 9.0nodejs Full support 10.4.0

Legend

Full support  
Full support
No support  
No support

Хід реалізації

Наведена нижче таблиця надає щоденний статус реалізації цієї функціональності, оскільки функціональність ще не досягла кросбраузерної стабільності. Дані генеруються запуском відповідних тестів функціональності у Test262, стандартному тестовому наборі JavaScript, на нічній збірці чи на останньому релізі рушія JavaScript кожного веб-переглядача.

Див. також