BigInt
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2020.
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.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
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-bigint-objects |
Совместимость с браузерами
BCD tables only load in the browser