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): +, *, -, **, %.

Побитовые операции (en-US) также поддерживаются, кроме >>> (сдвиг вправо с заполнением нулями).

Не поддерживаемый унарный оператор (+) больше не ломает 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 ведёт себя как обычное число в следующих случаях:

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() (en-US)
Возвращает строку с языкозависимым представлением числа. Переопределяет метод Object.prototype.toLocaleString().
BigInt.prototype.toString() (en-US)
Возвращает строку, представляющую указанный объект по указанному основанию системы счисления. Переопределяет метод Object.prototype.toString().
BigInt.prototype.valueOf() (en-US)
Возвращает примитивное значение указанного объекта. Переопределяет метод 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

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

Specification
ECMAScript Language Specification (ECMAScript)
# sec-bigint-objects

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

BCD tables only load in the browser

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