Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Set в JavaScript и зачем нужен new Set()?
Set — это встроенный в JavaScript объект (коллекция), который позволяет хранить уникальные значения любого типа: примитивы (строки, числа) или ссылки на объекты. Ключевая особенность Set — каждое значение может встречаться в коллекции только один раз. Создаётся он с помощью конструктора new Set().
Основные характеристики и отличия от массивов
- Уникальность значений:
Setавтоматически исключает дубликаты. Попытка добавить уже существующее значение игнорируется. - Ключи и значения: В
Setи ключами, и значениями являются сами элементы (для обеспечения совместимости сMapAPI). Это отличает его от объектов, где ключи — всегда строки или символы. - Порядок элементов:
Setсохраняет порядок вставки элементов. При итерации элементы возвращаются в том порядке, в котором были добавлены. - Производительность: Проверка наличия элемента (
has) вSetвыполняется существенно быстрее, чем в массиве (includes), особенно на больших объёмах данных, посколькуSetиспользует хэш-таблицу для внутреннего представления данных.
Создание и базовое использование
// Создание нового пустого Set
const uniqueNumbers = new Set();
// Создание Set из итерируемого объекта (обычно — массива)
const fromArray = new Set([1, 2, 3, 2, 1, 'hello', 'hello']);
console.log(fromArray); // Set(4) { 1, 2, 3, 'hello' } - дубликаты удалены
// Добавление элементов с помощью .add()
const letters = new Set();
letters.add('a');
letters.add('b');
letters.add('a'); // Этот вызов будет проигнорирован
console.log(letters.size); // 2
Основные методы и свойства
.add(value): Добавляет значение в коллекцию. Возвращает самSet, что позволяет делать цепочки вызовов..has(value): Проверяет, существует ли значение в коллекции. Возвращаетboolean..delete(value): Удаляет конкретный элемент. Возвращаетtrue, если элемент существовал и был удалён..clear(): Полностью очищает коллекцию..size: Свойство (не метод!), возвращающее количество элементов..forEach(callbackFn): Вызывает функцию для каждого элемента.- Итераторы:
Setявляется итерируемым объектом. У него есть методы.keys(),.values()(оба возвращают итератор по значениям) и.entries()(возвращает итератор по парам[value, value]). Это позволяет использоватьfor...of.
const mySet = new Set(['js', 'html', 'css']);
// Итерация с for...of
for (let tech of mySet) {
console.log(tech); // 'js', 'html', 'css'
}
// Преобразование Set обратно в массив (частая операция)
const techArray = [...mySet]; // ['js', 'html', 'css']
const techArrayAlt = Array.from(mySet);
Практические примеры применения
-
Удаление дубликатов из массива — самое частое использование.
const duplicatedArray = [1, 2, 2, 3, 4, 4, 5]; const uniqueArray = [...new Set(duplicatedArray)]; // [1, 2, 3, 4, 5] -
След за посещёнными элементами (например, ID просмотренных товаров).
const viewedItems = new Set(); function viewItem(itemId) { viewedItems.add(itemId); // Гарантированно уникальный список просмотренных товаров } -
Проверка на уникальность перед выполнением действия.
const activeUsers = new Set(); function login(user) { if (activeUsers.has(user.id)) { alert('Пользователь уже в системе!'); return; } activeUsers.add(user.id); // ...логика входа } -
Работа со сложными данными (объектами). Важно помнить, что
Setхранит ссылки на объекты.const objSet = new Set(); const obj = { name: 'John' }; objSet.add(obj); objSet.add(obj); // Не добавится objSet.add({ name: 'John' }); // Добавится, это другой объект в памяти
Отличия от WeakSet
Важно не путать Set с WeakSet. WeakSet:
- Может содержать только объекты (не примитивы).
- Ссылки на объекты являются «слабыми»: если объект становится недостижим из другого места кода, он будет автоматически удалён из
WeakSetсборщиком мусора. - Не является итерируемым (нет методов
.keys(),.values(),.forEach(), свойства.size). - Используется для хранения дополнительных метаданных или флагов, связанных с объектами, без риска утечек памяти.
Вывод: new Set() — это мощный и производительный инструмент для работы с коллекциями уникальных значений. Он незаменим для задач дедупликации, быстрой проверки на вхождение и управления уникальными списками в современном JavaScript. Его API интуитивно понятен и хорошо интегрируется с остальными возможностями языка, такими как оператор расширения (...) и Array.from().