> Какие коллекции кроме 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
// Map
const map = new Map();
map.set('key', 'value');
map.set(42, 'number key');
map.set(obj, 'object key');
console.log(map.size); // 3
// WeakMap
const wm = new WeakMap();
let obj = { data: 'secret' };
wm.set(obj, 'private info');
obj = null; // запись удалится сборщиком мусора
// WeakSet
const 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 для частых операций с ключами-объектами.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью