Комментарии (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 (слабое сравнение)
Таблица сравнения
| Параметр | Map | BigInt |
|---|---|---|
| Тип | Структура данных | Числовой примитив |
| Назначение | Хранение пар ключ-значение | Большие целые числа |
| Ключ | Может быть любой тип | 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>), но решают разные задачи.