--- 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 кожного веб-переглядача.