--- title: BigInt slug: Web/JavaScript/Reference/Global_Objects/BigInt tags: - BigInt - JavaScript - методы BigInt - свойства BigInt translation_of: Web/JavaScript/Reference/Global_Objects/BigInt ---
{{JSRef}}
BigInt это встроенный объект, который предоставляет способ представлять целые числа больше 253 - 1, наибольшего числа, которое JavaScript может надёжно представить с {{JSxRef("Number")}} примитивом. Это максимальное значение можно получить, обратившись к {{JSxRef("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
В некотором смысле он похож на {{JSxRef ("Number")}}, но отличается в некоторых ключевых моментах — его нельзя использовать с методами во встроенном объекте {{JSxRef ("Math")}} и нельзя смешивать в операциях с любыми экземплярами Number.
{{JSxRef("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 равен {{JSxRef ("Number")}} только при нестрогом сравнении.
0n === 0 // ↪ false 0n == 0 // ↪ true
{{JSxRef("Global_Objects/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]
Обратите внимание, что сравнения с обьектом-обёрткой BigInt действуют как с другими объектами, указывая на равенство только когда сравнивается идентичный экземпляр объекта:
0n === Object(0n); // false Object(0n) === Object(0n); // false const o = Object(0n); o === o // true
BigInt ведёт себя как {{JSxRef("Global_Objects/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()Поскольку приведение между {{JSxRef("Number")}} и BigInt может привести к потере точности, рекомендуется использовать BigInt только тогда, когда разумно ожидаются значения, превышающие 253 и не приводить между двумя типами.
Операции поддерживаемые BigInt не постоянны во времени. BigInt следовательно не пригоден для использования в криптографии.
Использование {{jsxref("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
{{Compat}}