← Назад к вопросам

Что такое New Set?

2.2 Middle🔥 111 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Set в JavaScript и зачем нужен new Set()?

Set — это встроенный в JavaScript объект (коллекция), который позволяет хранить уникальные значения любого типа: примитивы (строки, числа) или ссылки на объекты. Ключевая особенность Set — каждое значение может встречаться в коллекции только один раз. Создаётся он с помощью конструктора new Set().

Основные характеристики и отличия от массивов

  • Уникальность значений: Set автоматически исключает дубликаты. Попытка добавить уже существующее значение игнорируется.
  • Ключи и значения: В Set и ключами, и значениями являются сами элементы (для обеспечения совместимости с Map API). Это отличает его от объектов, где ключи — всегда строки или символы.
  • Порядок элементов: 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);

Практические примеры применения

  1. Удаление дубликатов из массива — самое частое использование.

    const duplicatedArray = [1, 2, 2, 3, 4, 4, 5];
    const uniqueArray = [...new Set(duplicatedArray)]; // [1, 2, 3, 4, 5]
    
  2. След за посещёнными элементами (например, ID просмотренных товаров).

    const viewedItems = new Set();
    function viewItem(itemId) {
        viewedItems.add(itemId);
        // Гарантированно уникальный список просмотренных товаров
    }
    
  3. Проверка на уникальность перед выполнением действия.

    const activeUsers = new Set();
    function login(user) {
        if (activeUsers.has(user.id)) {
            alert('Пользователь уже в системе!');
            return;
        }
        activeUsers.add(user.id);
        // ...логика входа
    }
    
  4. Работа со сложными данными (объектами). Важно помнить, что 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().