JS Advanced

BigInt

Понять, когда Number недостаточен, как работает BigInt, и почему нельзя смешивать BigInt и Number.

Продвинутый (Advanced)

Кратко

BigInt — тип для целых чисел произвольной длины. Создаётся через суффикс n (123n) или BigInt(123). В отличие от Number: нет потери точности для больших целых. Ограничение: нельзя смешивать BigInt и Number в арифметике.


Подробно

Создание: const big = 123n; const fromNumber = BigInt(123); const fromString = BigInt('9007199254740993');

Number vs BigInt: console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 console.log(9007199254740992 === 9007199254740993); // true (потеря точности!) console.log(9007199254740992n === 9007199254740993n); // false (точно!)

Ограничение — нельзя смешивать: const result = 1n + 1; // TypeError: Cannot mix BigInt and other types const result2 = 1n + BigInt(1); // 2n (OK) const result3 = Number(1n) + 1; // 2 (OK, но может потерять точность)

Сравнение (работает): console.log(1n == 1); // true console.log(1n === 1); // false (разные типы) console.log(1n < 2); // true

Округление: console.log(Number(123n)); // 123 console.log(123n.toString()); // '123'

Использование:

  • Криптовалюты (целые сатоши)
  • ID баз данных (64-bit integers)
  • Точные вычисления с большими числами

Ментальная модель

BigInt — как калькулятор с бесконечным дисплеем. Обычный Number — калькулятор с 16-значным дисплеем (теряет точность после 15-16 цифр). BigInt — калькулятор, который помнит каждую цифру, но не понимает дробей.


Примеры

**Самый простой:**

javascript
const a = 123456789012345678901234567890n;
const b = BigInt('999999999999999999999');

console.log(a + b); // 123456789012345678901345678889n
console.log(typeof a); // 'bigint'

BigInt: создание и арифметика.

**Простой:**

javascript
// Number: потеря точности
console.log(9007199254740992 + 1); // 9007199254740992 (ошибка!)

// BigInt: точно
console.log(9007199254740992n + 1n); // 9007199254740993n

// Сравнение
console.log(1n == 1);  // true (приведение типа)
console.log(1n === 1); // false (разные типы)

Number vs BigInt: точность больших целых.

**Реальный пример:**

javascript
// Криптовалюта: сатоши (1 BTC = 10^8 satoshi)
const satoshiBalance = 2100000000000000n; // 21 млн BTC в сатоши

function toBTC(satoshi) {
  return Number(satoshi) / 100000000;
}

console.log(toBTC(satoshiBalance)); // 21000000

// ID базы данных
const userId = BigInt('1234567890123456789');
console.log(userId.toString()); // '1234567890123456789'

Реальные use cases: криптовалюта, ID баз данных.


Частые ошибки

**Неправильно:** Смешивать BigInt и Number в арифметике

**Почему:** 1n + 1 — TypeError. Нужно явно преобразовывать.

**Правильно:** BigInt(1) + 1n или Number(1n) + 1.

**Неправильно:** Использовать BigInt для дробных чисел

**Почему:** BigInt работает только с целыми. Для дробных — Number.

**Правильно:** BigInt = целые. Number = целые + дробные (с ограничением точности).

**Неправильно:** Забывать, что BigInt медленнее Number

**Почему:** BigInt — произвольная точность, что медленнее фиксированных 64-bit float.

**Правильно:** Используйте BigInt только когда Number недостаточен.


Важно запомнить

  • BigInt: суффикс n или BigInt()
  • Точнее Number для больших целых
  • Нельзя смешивать BigInt и Number
  • === всегда false (разные типы)
  • Используйте только когда нужно

Связь

Назад: Вы знаете типы (J3) и числа (J21). BigInt расширяет систему чисел.

Вперёд: Следующий урок (JV19) — Intl — API интернационализации.

Материалы курса JS Advanced — PROlab Academy.