BigInt

BigInt это встроенный объект, который предоставляет способ представлять целые числа больше 253 - 1, наибольшего числа, которое JavaScript может надежно представить с Number примитивом. Это максимальное значение можно получить, обратившись к Number.MAX_SAFE_INTEGER.

Описание

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

В некотором смысле он похож на Number, но отличается в некоторых ключевых моментах — его нельзя использовать с методами во встроенном объекте Math и нельзя смешивать в операциях с любыми экземплярами Number.

Number и BigInt нельзя смешивать в операциях — они должны быть приведены к тому же типу.

Будте осторожны приводя значения туда и обратно,  так как точность BigInt может быть потеряна при приведении к числу (Number).

Тип

При проверке с использованием оператора typeof, BigInt выдает тип "bigint":

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

При оборачивании в объект, BigInt будет представлен как обычный объект:

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

Операторы

Следующие операторы могут использоваться с 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, эта операция будет округляться в меньшую сторону, то есть она не будет возвращать какие-либо дробные цифры.

Результат операции с дробным результатом будет округлен в меньшую сторону при использовании  BigInt.

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

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

Сравнения

BigInt равен Number только при нестрогом сравнении.

0n === 0
// ↪ false

0n == 0
// ↪ true

Обычные числа и 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]

Обратите внимание, что сравнения с обьектом-оберткой BigInt действуют как с другими объектами, указывая на равенство только когда сравинивается идентичный экземпляр объекта:

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

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

Условные выражения

BigInt ведёт себя как обычное число в следующих случаях:

  • Преобразуется в Boolean через функцию Boolean
  • Используется с логическими операторами Logical Operators ||, && и !
  • В условном тесте, таком как if statement.
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()
Оборачивает a 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 в качестве аргумента и возвращает 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)
Определение 'BigInt objects' в этой спецификации.

Совместимость браузера

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
BigIntChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
BigInt() constructorChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
asIntNChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
asUintNChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
toLocaleStringChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
toStringChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0
valueOfChrome Полная поддержка 67Edge Полная поддержка 79Firefox Полная поддержка 68IE Нет поддержки НетOpera Полная поддержка 54Safari Нет поддержки НетWebView Android Полная поддержка 67Chrome Android Полная поддержка 67Firefox Android Полная поддержка 68Opera Android Полная поддержка 48Safari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 9.0nodejs Полная поддержка 10.4.0

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Смотрите также