Gernar
Frontend DeveloperJavaScript

Интервью-вопрос

Что такое Set в JavaScript

Set хранит уникальные значения и помогает быстро проверять наличие элемента. На интервью вам важно сказать не только про методы, но и про сравнение значений, объекты по ссылке и ограничения по сравнению с массивом.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше сказать про Set на интервью?

Вы отвечаете на базовый вопрос и хотите сразу показать практическую пользу.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Set это встроенная коллекция JavaScript, где каждое значение может встретиться только один раз. Если добавить одно и то же значение повторно, размер коллекции не увеличится.

const ids = new Set([1, 2, 2, 3]);

ids.add(3);
ids.add(4);

console.log(ids.size); // 4
console.log(ids.has(2)); // true
console.log([...ids]); // [1, 2, 3, 4]

Для ответа на интервью достаточно начать с этого поведения, а затем добавить практический вывод: Set помогает там, где важна уникальность или частая проверка наличия.

Чем Set отличается от массива

Массив хранит упорядоченный список с индексами. Set хранит уникальные значения и дает методы для работы с наличием значения. Порядок итерации у Set есть, он соответствует порядку добавления, но обращаться как set[0] нельзя.

Если вам нужно отрисовать список, часто удобнее преобразовать Set в массив:

const selectedIds = new Set(["a1", "b2"]);
const selectedIdsArray = Array.from(selectedIds);

Практический риск такой: если назвать Set массивом без дублей, вы можете пропустить ограничения API. Например, у Set нет прямого map, поэтому для JSX-рендера обычно делают [...set].map(...).

Как выбрать Set или другую структуру

1Нужно быстро проверять, есть ли значение в коллекции?
Выбирайте Set и метод has.
2Нужно сохранить только уникальные primitive-значения или id?
Set подходит, особенно для списков выбранных элементов.
3Нужен доступ по индексу, map, filter или порядок как часть модели UI?
Оставьте массив и удаляйте дубли отдельно, если это нужно.
4Нужна уникальность объектов по полю, например по user.id?
Храните ключи в Set или используйте Map с id как ключом.

Как работает уникальность

Для примитивов поведение обычно ожидаемое: одинаковые строки, числа или boolean-значения не дублируются. Но важный нюанс в том, что Set использует сравнение SameValueZero.

const values = new Set();

values.add(NaN);
values.add(NaN);
values.add(0);
values.add(-0);

console.log(values.size); // 2

Это значит, что NaN считается тем же самым NaN, а 0 и -0 считаются одним значением. На практике это редко ломает UI, но на интервью такой нюанс отличает точный ответ от упрощенного.

Ловушка с объектами

Объекты, массивы и функции в Set сравниваются по ссылке. Два объекта с одинаковыми полями не станут одним элементом, если это разные ссылки.

const users = new Set();

users.add({ id: 1, name: "Ann" });
users.add({ id: 1, name: "Ann" });

console.log(users.size); // 2

Если вам нужна уникальность пользователей по id, храните в Set сами id:

const userIds = new Set();

userIds.add(1);
userIds.add(1);

console.log(userIds.size); // 1

Это особенно полезно во фронтенде для выбранных строк таблицы, раскрытых карточек, уже загруженных id или фильтров.

Практический пример во фронтенде

Типичный сценарий: пользователь выбирает элементы в списке, а вам нужно быстро проверять, выбран ли конкретный id.

function toggleSelected(prevSelected, id) {
  const next = new Set(prevSelected);

  if (next.has(id)) {
    next.delete(id);
  } else {
    next.add(id);
  }

  return next;
}

В React важно создавать новый Set, а не мутировать старый объект состояния. Плохой вариант выглядит так:

// Плохо: мутирует тот же Set
selectedIds.add(id);
setSelectedIds(selectedIds);

Такой код может привести к неочевидному багу обновления UI, потому что ссылка на состояние остается той же. Безопаснее делать так:

setSelectedIds((prev) => toggleSelected(prev, id));

Что сказать коротко на интервью

Хорошая короткая формулировка может звучать так:

Set это коллекция уникальных значений в JavaScript. Я использую его, когда нужно убрать дубли или быстро проверять наличие элемента, например id выбранных строк. У Set есть add, delete, has, clear и size. Важно помнить, что это не массив. Доступа по индексу нет, а объекты сравниваются по ссылке.

Если хотите усилить ответ, добавьте один нюанс про SameValueZero или про React state. Главное не уходить в длинную лекцию, пока вас не спросили подробнее.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Ждать глубокого сравнения объектов

    Set не сравнивает объекты по полям. Если добавить { id: 1 } два раза как два разных объекта, в коллекции будут два элемента. Для фронтенда безопаснее хранить в Set идентификаторы, например selectedIds.
  2. 2

    Называть Set массивом

    У Set нет индексов и методов вроде map или filter напрямую. Если в UI нужна трансформация списка, сначала преобразуйте его в массив: [...set]. Иначе ответ звучит так, будто вы не видите разницу между структурами данных.
  3. 3

    Забывать про SameValueZero

    Сравнение в Set не совсем то же самое, что обычное ===. Например, NaN считается тем же самым значением, если добавить его повторно. На интервью это хороший нюанс, который показывает аккуратность.
  4. 4

    Использовать Set там, где нужен счетчик

    Set хранит только факт наличия значения, но не количество повторов. Если нужно посчитать, сколько раз встретился товар, тег или ошибка, используйте Map со счетчиком. Иначе вы потеряете данные уже на этапе добавления.
  5. 5

    Мутировать Set в состоянии React без новой ссылки

    Если хранить Set в state и вызвать set.add(id) на той же ссылке, React может не увидеть изменение как новое состояние. Создавайте новый экземпляр: setSelected(prev => new Set(prev).add(id)). Так UI обновится предсказуемо.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которые помогут вам уверенно объяснить Set, сравнение значений и практические ограничения.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание