> Какие коллекции кроме Set существуют в JavaScript (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: IT-One
Стек: JavaScript
> Пример ответа
Короткий ответ
В JavaScript помимо Set существуют коллекции Map, WeakMap и WeakSet. Map хранит пары ключ-значение с любыми типами ключей. WeakMap и WeakSet - это "слабые" версии, где ключи (в WeakMap) и значения (в WeakSet) хранятся по слабой ссылке, что позволяет сборщику мусора удалять их при отсутствии других ссылок. Также есть обычные объекты и массивы, но они не являются специализированными коллекциями.
Подробное объяснение
В JavaScript есть несколько встроенных коллекций, каждая со своим назначением:
-
Map - коллекция для хранения пар ключ-значение. В отличие от обычных объектов, ключи могут быть любого типа (включая объекты, функции, примитивы). Map сохраняет порядок вставки элементов и имеет удобные методы:
set,get,has,delete,clear, а также свойствоsize. -
WeakMap - аналог Map, но с ключами только объектного типа (или функций). Ссылки на ключи являются слабыми: если на объект-ключ нет других ссылок, он удаляется сборщиком мусора, и соответствующая запись исчезает из WeakMap. WeakMap не итерируема, у неё нет метода
clearи свойстваsize. Используется для хранения приватных данных или метаданных, связанных с объектами. -
WeakSet - аналог Set, но значениями могут быть только объекты. Ссылки на объекты слабые, поэтому объекты автоматически удаляются из WeakSet, когда на них нет других ссылок. WeakSet не итерируема, нет
sizeиclear. Применяется для пометки объектов (например, "уже обработан"). -
Обычные объекты (
Object) - тоже могут использоваться как коллекции, но с ограничениями: ключи только строки или символы, нет гарантии порядка (хотя в современных движках он сохраняется для строковых ключей), нет встроенных методов для работы как с коллекцией. -
Массивы (
Array) - упорядоченные коллекции значений, но не ассоциативные.
На практике
Выбор коллекции зависит от задачи:
-
Map - когда нужны ключи любого типа, частые операции добавления/удаления, важен порядок или размер коллекции. Например, кэширование результатов по объекту.
-
WeakMap - когда нужно связать данные с объектом, но не препятствовать его сборке мусора. Например, хранение приватных полей в классах или метаданных для DOM-элементов.
-
WeakSet - для отслеживания множества объектов без утечек памяти. Например, пометка посещённых узлов в графе.
-
Set - когда нужна коллекция уникальных значений любого типа, с быстрым поиском.
-
Object - для простых словарей со строковыми ключами, когда не нужны методы Map.
Пример кода
JAVASCRIPT// Mapconst map = new Map();map.set('key', 'value');map.set(42, 'number key');map.set(obj, 'object key');console.log(map.size); // 3// WeakMapconst wm = new WeakMap();let obj = { data: 'secret' };wm.set(obj, 'private info');obj = null; // запись удалится сборщиком мусора// WeakSetconst ws = new WeakSet();let visited = { id: 1 };ws.add(visited);visited = null; // объект удалится из WeakSet
Как отвечать на собеседовании
Начни с перечисления всех коллекций: Set, Map, WeakMap, WeakSet. Кратко объясни разницу между ними, сделав акцент на WeakMap и WeakSet - это часто спрашивают. Упомяни, что обычные объекты и массивы тоже можно считать коллекциями, но они не оптимизированы для этой роли. Приведи примеры использования WeakMap для приватных данных или WeakSet для пометки объектов. Не углубляйся в детали реализации сборщика мусора, если не спросят.
Что проверяет интервьюер
- Знание всех встроенных коллекций, а не только Set.
- Понимание разницы между сильными и слабыми ссылками.
- Умение выбирать подходящую коллекцию под задачу.
- Осведомлённость о практических применениях WeakMap и WeakSet (например, в кэшировании или управлении памятью).
Типичные ошибки
- Забывают упомянуть WeakMap и WeakSet.
- Путают WeakMap с Map: думают, что WeakMap можно итерировать или узнать её размер.
- Считают, что WeakMap принимает примитивные ключи.
- Не понимают, зачем нужны слабые ссылки - думают, что WeakMap просто "слабее" хранит данные.
- Используют Object вместо Map для частых операций с ключами-объектами.
> Похожие задачи по frontend
Какие новые возможности JavaScript знаешь
Куда пойдет выполнение после запуска промиса в JavaScript
Какие данные (примитивы или объекты) можно хранить в localStorage
Почему this динамический в JavaScript и когда он определяется
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью