BigInt
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since ÑенÑÑбÑÑ 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® 2027 Language Specification> # sec-bigint-objects> |