Чем Map отличается от обычного объекта, а Set от массива?
Массивы и структуры данных
Map — коллекция пар «ключ — значение» с любыми типами ключей и сохранением порядка вставки, а Set — коллекция уникальных значений. Обычный объект и массив решают похожие задачи, но имеют ограничения.
Map и объект
- Тип ключа — Map: любой (объект, функция, число); Object: строка или Symbol
- Размер — Map:
map.size; Object:Object.keys(obj).length - Порядок — Map: порядок вставки; Object: порядок зависит от типа ключа
- Прототип — Map: нет лишних ключей; Object: есть унаследованные ключи
- Производительность — Map: оптимизирован под частые добавления/удаления; Object: быстрее для небольших статических структур
const map = new Map();
const key = { id: 1 };
map.set(key, 'value');
map.get(key); // 'value'Ключ объекта-литерала всегда превращается в строку: obj[{}] и obj['[object Object]'] — один и тот же ключ.
Set и массив
const unique = new Set([1, 2, 2, 3]); // {1, 2, 3}
unique.has(2); // быстрая проверка наличия
[...unique]; // обратно в массивSetхранит только уникальные значения.- Проверка
hasи удаление выполняются за O(1) в среднем, аincludesиindexOfв массиве — за O(n). - У
Setнет индексов и методовmap/filter: для них его преобразуют в массив.
Когда что выбирать
- Счётчики, кеши, словарь с нестроковыми ключами —
Map. - Дедупликация и быстрая проверка принадлежности —
Set. - Данные с известной формой и сериализацией в JSON — объект и массив.
Коротко для собеседования
Map допускает любые ключи, помнит порядок и имеет size, Set хранит уникальные значения с быстрым has. Объект и массив проще и сериализуются в JSON, но ключи объекта — только строки и Symbol.