Map в JavaScript — чем отличается от обычного объекта?
Везде пишут new Map, но я не понимаю, зачем он, если есть обычные объекты {}. Ведь объект — это тоже пары ключ-значение.
Когда стоит брать new map js вместо {}? В чём реальная разница и как с Map работать? Можно пример?
2 ответа
Map — это тоже хранилище пар «ключ → значение», но с важными отличиями от объекта.
Базовые операции:
const m = new Map();
m.set('name', 'Аня');
m.set('age', 20);
console.log(m.get('name')); // 'Аня'
console.log(m.has('age')); // true
console.log(m.size); // 2
m.delete('age');
Главные отличия от обычного {}:
- Ключом может быть что угодно — не только строка, но и число, объект, даже функция:
const userKey = { id: 1 };
m.set(userKey, 'данные пользователя');
console.log(m.get(userKey)); // работает
В обычном объекте все ключи приводятся к строкам, поэтому {} так не умеет.
-
Легко узнать размер —
m.size, а у объекта пришлось бы писатьObject.keys(obj).length. -
Удобно перебирать — Map перебирается по порядку добавления:
for (const [key, value] of m) {
console.log(key, '=', value);
}
- Нет лишних ключей из прототипа — у объекта можно случайно наткнуться на
toStringи прочее наследованное.
Когда брать Map: когда ключи не строки, когда часто добавляешь/удаляешь, когда важен порядок и нужен размер. Когда брать {}: для простой фиксированной структуры данных и когда нужен JSON (Map в JSON напрямую не сериализуется).
Короткое практическое правило, которое мне помогло:
- данные как «запись о чём-то» с известными полями → объект
{}; - данные как «словарь / хеш-таблица», где ключи приходят динамически (особенно не-строки) →
Map.
Плюс Map реально удобнее, когда нужно часто считать size и итерироваться — меньше возни, чем с Object.keys.