BigInt
BigInt
є вбудованим об'єктом, який надає можливість відображати неушкодженими числа, більші за 253 - 1, тобто, за найбільше число, яке може надійно відобразити JavaScript за допомогою примітиву 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
Використання 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
Специфікації
Сумісність з веб-переглядачами
BCD tables only load in the browser
Хід реалізації
Наведена нижче таблиця надає щоденний статус реалізації цієї функціональності, оскільки функціональність ще не досягла кросбраузерної стабільності. Дані генеруються запуском відповідних тестів функціональності у Test262, стандартному тестовому наборі JavaScript, на нічній збірці чи на останньому релізі рушія JavaScript кожного веб-переглядача.