BigInt vs Int
Що таке BigInt
BigInt- це спеціальний числовий тип, що дозволяє працювати з цілими числами довільної довжини (без обмеження 2⁵³−1).
Створюється додаванням n в кінці числа або викликом функції BigInt().
const big = 123456789012345678901234567890n;
const big2 = BigInt("123456789012345678901234567890");Проблема звичайних чисел (Number)
У JavaScript усі звичайні числа мають тип Number
і зберігаються у форматі IEEE 754 (64-бітне число з рухомою комою).
Це означає, що JS може точно представляти лише цілі числа до:
Number.MAX_SAFE_INTEGER === 9007199254740991; // 2^53 - 1Якщо число більше, починається втрата точності.
Приклад зі звичайними числами
const num = 9007199254740991;
console.log(num + 1); // 9007199254740992
console.log(num + 2); // 9007199254740992 (помилка!)Числа "злиплися": JS не може розрізнити
+1і+2.
Рішення: BigInt
const big = 9007199254740991n;
console.log(big + 1n); // 9007199254740992n
console.log(big + 2n); // 9007199254740993nBigInt дозволяє працювати з числами будь-якої довжини без втрати точності.
Як створити BigInt
const a = 10n; // літерал
const b = BigInt(10); // через функцію
const c = BigInt("9007199254740995"); // з рядкаАле не можна використовувати десяткові дроби:
BigInt(1.5); // TypeErrorАрифметика з BigInt
Підтримуються базові операції:
const x = 5n;
const y = 2n;
console.log(x + y); // 7n
console.log(x - y); // 3n
console.log(x * y); // 10n
console.log(x / y); // 2n (дробова частина відкидається)
console.log(x ** y); // 25nДілення завжди повертає ціле число, дробова частина відкидається.
Не можна змішувати Number і BigInt напряму
const big = 10n;
const num = 5;
console.log(big + num); // TypeError: Cannot mix BigInt and other typesПотрібно явно привести тип:
console.log(big + BigInt(num)); // 15n
// або
console.log(Number(big) + num); // 15Порівняння Number і BigInt
| Особливість | Number | BigInt |
|---|---|---|
| Тип | число з рухомою комою | ціле число довільної довжини |
| Максимальна точність | до 2⁵³−1 | необмежено |
| Підтримка дробів | так | ні |
| Операції | стандартні | стандартні, але лише цілі |
| Сумісність | всюди | з 2020 року |
Використання з JSON | так | ні (помилка при JSON.stringify()) |
Приклад практичного застосування
Зберігання великих ID (наприклад, з бази даних)
const userId = 183748917238479182374981273n;Криптографія, блокчейн, фінанси
const balance = 999999999999999999999999999n;
const transfer = 250000000000000000000n;
console.log(balance - transfer); // працює точноBigInt і порівняння
Можна порівнювати з Number: JS автоматично приведе тип:
10n == 10; // true (нестроге порівняння)
10n === 10; // false (строге, різні типи)Приклад з Math (несумісно)
BigInt не працює з функціями Math:
Math.sqrt(4n); // TypeErrorАле можна використовувати
Number(bigint), якщо потрібно.
Підсумок
| Критерій | Number | BigInt |
|---|---|---|
| Тип | число з рухомою комою | ціле число будь-якої довжини |
| Втрата точності | після 2⁵³−1 | немає |
| Підтримка дробів | є | немає |
| Арифметика | стандартна | лише цілі |
| Приведення типів | не сумісний напряму | потрібно приводити |
| Використання | для звичайних чисел | для дуже великих цілих |
Коротко
BigInt- це тип для роботи з великими цілими числами.- Використовується, коли потрібно зберегти точність (ідентифікатори, криптовалюта, гроші, лічильники).
- Не можна змішувати з
Numberнапряму. - Не підтримує дробові значення.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.