← Назад к вопросам

В чем разница между BigMap и Map?

1.0 Junior🔥 201 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между BigInt и Map

Это два разных типа данных JavaScript, которые часто путают на интервью, но они решают совершенно разные проблемы.

Map — это хеш-таблица для хранения пар ключ-значение

Map — встроенная структура данных для хранения коллекции пар ключ → значение, где ключом может быть любой тип данных (не только строки).

// Создание Map
const map = new Map();

// Добавление данных
map.set('name', 'Alice');
map.set(1, 'number key');
map.set({}, 'object key');
map.set(true, 'boolean key');

// Получение данных
console.log(map.get('name')); // 'Alice'
console.log(map.get(1)); // 'number key'

// Проверка наличия
if (map.has('name')) {
  console.log('Ключ существует');
}

// Удаление
map.delete('name');

// Размер
console.log(map.size); // 3

// Очистка
map.clear();

// Итерация
for (const [key, value] of map) {
  console.log(key, value);
}

BigInt — это числа произвольной величины

BigInt — примитивный тип для работы с очень большими целыми числами, которые не помещаются в обычный JavaScript Number (±2^53).

// Обычное число (JavaScript Number)
const maxSafe = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(maxSafe + 1 === maxSafe + 2); // true — потеря точности!

// BigInt
const big = 9007199254740991n; // Суффикс 'n'
const big2 = 9007199254740992n;
console.log(big + 1n === big2 + 1n); // true — точность сохранена

// Создание BigInt
const a = BigInt(123);
const b = BigInt('456');
const c = 789n;

// Операции с BigInt
const sum = a + b; // BigInt
const product = a * c; // BigInt
const power = a ** b; // BigInt

// Деление (результат целое число)
console.log(10n / 3n); // 3n (не 3.33)

// Сравнение
console.log(5n > 3); // true
console.log(5n === 5); // false! Разные типы
console.log(5n == 5); // true (слабое сравнение)

Таблица сравнения

ПараметрMapBigInt
ТипСтруктура данныхЧисловой примитив
НазначениеХранение пар ключ-значениеБольшие целые числа
КлючМожет быть любой типN/A
РазмерМожет быть сколько угодно парЧисла до ±∞
ПроизводительностьO(1) для операцийO(n) при арифметике большие числа
Методыset, get, has, delete, clear, size+, -, *, /, %, **
СравнениеТолько === и ==Поддержу === и == с coercion

Когда использовать Map

// 1. Словарь / кэш с динамическими ключами
const cache = new Map();
const key = { id: 1 };
cache.set(key, 'result');

// 2. Подсчёт частоты элементов
const wordCount = new Map();
for (const word of words) {
  const count = wordCount.get(word) || 0;
  wordCount.set(word, count + 1);
}

// 3. Граф или список смежности
const graph = new Map();
graph.set('A', ['B', 'C']);
graph.set('B', ['A', 'D']);

// 4. Когда нужны только строки как ключи
// Object часто быстрее, но Map удобнее
const config = new Map([
  ['debug', true],
  ['timeout', 5000],
]);

Когда использовать BigInt

// 1. Криптография и security
const privateKey = 123456789012345678901234567890n;
const encrypted = (message * privateKey) % prime;

// 2. Работа с большими ID (database, blockchain)
const userId = 999999999999999999n;
const transactionId = 888888888888888888n;

// 3. Математика (факториалы, combinatorics)
function factorial(n) {
  if (n <= 1n) return 1n;
  return n * factorial(n - 1n);
}
console.log(factorial(100n)); // Работает!

// 4. Blockchain и криптовалюты
const wei = 1000000000000000000n; // 1 ETH в wei
const satoshi = 100000000n; // 1 BTC в satoshi

// 5. JSON числовых данных
const data = {
  balance: 999999999999999999n, // Большой баланс
  timestamp: Date.now(), // Обычное число
};

Важные ограничения BigInt

// Нельзя смешивать с Number
const result = 5n + 5; // TypeError!
const result = 5n + BigInt(5); // OK: 10n

// Нельзя использовать в Math
Math.max(5n, 10n); // TypeError!

// JSON.stringify игнорирует BigInt
JSON.stringify({ big: 123n }); // '{"big":null}'

// Нельзя использовать ** с отрицательной степенью
2n ** -1n; // RangeError!

Оптимизация: Map vs Object

// Для простых словарей Object часто быстрее
const obj = { a: 1, b: 2 }; // ~10ns
const map = new Map([ ['a', 1], ['b', 2] ]); // ~50ns

// Но для сложных операций Map удобнее
map.size; // OK
Object.keys(obj).length; // Need to count

map.clear(); // OK
// Для object нужно переассигнить

Практический пример: система рейтинга

class RatingSystem {
  constructor() {
    this.ratings = new Map(); // userId -> rating
    this.transactions = new Map(); // transactionId -> data
  }

  addRating(userId, transactionId, score) {
    const key = userId + '_' + transactionId;
    this.ratings.set(key, {
      score,
      timestamp: BigInt(Date.now()),
    });
  }

  getAverage(userId) {
    let sum = 0n;
    let count = 0;
    
    for (const [key, data] of this.ratings) {
      if (key.startsWith(userId)) {
        sum += BigInt(data.score);
        count++;
      }
    }
    
    return count > 0 ? Number(sum / BigInt(count)) : 0;
  }
}

Вывод: Map и BigInt — это совершенно разные инструменты. Map управляет коллекциями данных, BigInt работает с большими числами. Они могут использоваться вместе (например, Map<BigInt, value>), но решают разные задачи.