--- title: BigInt slug: Web/JavaScript/Reference/Global_Objects/BigInt tags: - BigInt - JavaScript - Довідка - Клас translation_of: Web/JavaScript/Reference/Global_Objects/BigInt ---
BigInt є вбудованим об'єктом, який надає можливість відображати неушкодженими числа, більші за 253 - 1, тобто, за найбільше число, яке може надійно відобразити JavaScript за допомогою {{Glossary("Primitive", "примітиву")}} Number та яке передається константою Number.MAX_SAFE_INTEGER. BigInt може використовуватись для довільно великих цілих чисел.
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
Тип BigInt певними рисами схожий на Number, але також відрізняється у кількох ключових моментах — він не може використовуватись з методами вбудованого об'єкта Math та не може змішуватись з екземплярами Number у операціях; вони мають бути приведені до одного типу. Однак, будьте обережні, перетворюючи значення туди й назад, бо BigInt може втратити точність при перетворенні на Number.
При перевірці на typeof, BigInt видасть "bigint":
typeof 1n === 'bigint' // true
typeof BigInt('1') === 'bigint' // true
При загортанні у Object, BigInt вважатиметься звичайним типом "object":
typeof Object(1n) === 'object' // true
Наступні оператори можна використовувати з BigInt (або з загорнутими у об'єкт 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, а не BigDecimal, ця операція округлить результат в бік 0 (іншими словами, вона не поверне десяткових знаків).
Дробова частина результату операції буде обрізана при використанні з BigInt.
const expected = 4n / 2n // ↪ 2n const rounded = 5n / 2n // ↪ 2n, а не 2.5n
BigInt не є строго рівним Number, але є нестрого рівним:
0n === 0 // ↪ false 0n == 0 // ↪ true
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 ] mixed.sort((a, b) => a - b) // не спрацює, оскільки віднімання не працює при змішуванні типів // TypeError: can't convert BigInt to number // сортування з потрібним порівнянням чисел mixed.sort((a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0) // ↪ [ -12n, 0, 0n, 4n, 4, 6, 10 ]
Зауважте, що порівняння чисел BigInt, загорнутих у об'єкт, працюють так само, як з іншими об'єктами, вони рівні тільки при порівнянні одного й того ж самого об'єкта:
0n === Object(0n) // false Object(0n) === Object(0n) // false const o = Object(0n) o === o // true
BigInt поводиться так само, як і Number, у тих випадках, де:
Boolean: функцією Boolean;||, && та !; абоif.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()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.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 в якості аргументу, повертає n-не просте число як 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
| Специфікація |
|---|
{{SpecName("ESDraft", "#sec-bigint-objects", "BigInt objects")}} |
{{Compat("javascript.builtins.BigInt")}}
Наведена нижче таблиця надає щоденний статус реалізації цієї функціональності, оскільки функціональність ще не досягла кросбраузерної стабільності. Дані генеруються запуском відповідних тестів функціональності у Test262, стандартному тестовому наборі JavaScript, на нічній збірці чи на останньому релізі рушія JavaScript кожного веб-переглядача.