Этот вопрос проверяет знание современных структур данных в JavaScript и их отличий от классических объектов для выбора подходящего инструмента под задачу.
Object — это базовая структура "ключ-значение", где ключи обычно являются строками или символами. Map — это более современная и специализированная структура "ключ-значение", которая позволяет использовать ключи любого типа (включая объекты), сохраняет порядок элементов и предоставляет удобные методы для работы. Set — это коллекция уникальных значений любого типа, которая также сохраняет порядок добавления.
Каждая структура данных предназначена для своих задач.
Ключи: Только строки или символы. Числа автоматически преобразуются в строки.
Порядок элементов: В современных JS порядок перечисления для строковых ключей соответствует порядку добавления (с некоторыми нюансами для целочисленных ключей), но исторически не гарантировался.
Итерация: Не является итерируемой по умолчанию. Для обхода нужно использовать Object.keys(), Object.values(), Object.entries().
Размер: Нет встроенного свойства для размера. Нужно вычислять через Object.keys(obj).length.
Использование: Идеально для представления структур, у которых ключи известны заранее (например, конфигурация, данные пользователя с фиксированными полями).
Ключи: Могут быть любого типа: объекты, функции, примитивы.
Порядок элементов: Гарантированно сохраняет порядок вставки элементов.
Итерация: Является итерируемой. Можно перебирать напрямую с помощью for...of или forEach.
Размер: Есть встроенное свойство size.
Производительность: Лучше подходит для частого добавления и удаления пар ключ-значение.
Использование: Отлично подходит для случаев, когда ключ неизвестен до времени выполнения, или когда ключом должен быть объект (например, для хранения метаданных DOM-элементов).
const map = new Map();
const keyObj = { id: 1 };
map.set(keyObj, 'value associated with object');
map.set(42, 'answer to everything');
console.log(map.get(keyObj)); // 'value associated with object'
console.log(map.size); // 2Значения: Коллекция уникальных значений любого типа.
Порядок элементов: Гарантированно сохраняет порядок вставки элементов.
Итерация: Является итерируемой.
Размер: Есть встроенное свойство size.
Использование: Идеально для создания списков без дубликатов и для быстрой проверки наличия элемента.
const set = new Set([1, 2, 3, 3, 4, 4]); // Дубликаты игнорируются
set.add(5);
console.log(set.has(3)); // true
console.log(set.size); // 4 (значения: 1, 2, 3, 4, 5)Используйте Object для статических структур с известными строковыми ключами. Используйте Map, когда нужны ключи не-строкового типа, частые обновления или важен порядок элементов. Используйте Set, когда вам нужно хранить коллекцию уникальных значений.