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