Интервью-вопрос
Что такое Set в JavaScript
Set хранит уникальные значения и помогает быстро проверять наличие элемента. На интервью вам важно сказать не только про методы, но и про сравнение значений, объекты по ссылке и ограничения по сравнению с массивом.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
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 или другую структуру
Выбирайте Set и метод has.Set подходит, особенно для списков выбранных элементов.Оставьте массив и удаляйте дубли отдельно, если это нужно.Храните ключи в 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
Ждать глубокого сравнения объектов
Setне сравнивает объекты по полям. Если добавить{ id: 1 }два раза как два разных объекта, в коллекции будут два элемента. Для фронтенда безопаснее хранить вSetидентификаторы, напримерselectedIds. - 2
Называть Set массивом
УSetнет индексов и методов вродеmapилиfilterнапрямую. Если в UI нужна трансформация списка, сначала преобразуйте его в массив:[...set]. Иначе ответ звучит так, будто вы не видите разницу между структурами данных. - 3
Забывать про SameValueZero
Сравнение вSetне совсем то же самое, что обычное===. Например,NaNсчитается тем же самым значением, если добавить его повторно. На интервью это хороший нюанс, который показывает аккуратность. - 4
Использовать Set там, где нужен счетчик
Setхранит только факт наличия значения, но не количество повторов. Если нужно посчитать, сколько раз встретился товар, тег или ошибка, используйтеMapсо счетчиком. Иначе вы потеряете данные уже на этапе добавления. - 5
Мутировать Set в состоянии React без новой ссылки
Если хранитьSetв state и вызватьset.add(id)на той же ссылке, React может не увидеть изменение как новое состояние. Создавайте новый экземпляр:setSelected(prev => new Set(prev).add(id)). Так UI обновится предсказуемо.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которые помогут вам уверенно объяснить Set, сравнение значений и практические ограничения.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое Map в JavaScript 😎
Map в JavaScript хранит пары ключ-значение и позволяет использовать ключи любого типа. На странице разбираем, чем Map отличается от объекта, когда он полезен во фронтенде и какие ловушки важно не пропустить на интервью.
Что делает метод bind 😎
Метод bind создает новую функцию с заранее привязанным this и, при необходимости, частью аргументов. Разбираем, чем он отличается от call и apply, где помогает во frontend-коде и какие ловушки есть со стрелочными функциями.