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

Что такое HashSet?

2.0 Middle🔥 172 комментариев
#JavaScript Core

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

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

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

Что такое HashSet в JavaScript?

HashSet — это абстрактный тип данных, который представляет собой коллекцию уникальных значений, где каждый элемент может присутствовать только один раз. В стандартной библиотеке JavaScript нет отдельного класса HashSet, но его функциональность полностью реализуется с помощью встроенного объекта Set, представленного в ES6 (ECMAScript 2015).

Ключевые характеристики HashSet (Set в JavaScript)

  • Уникальность значений: Все значения в Set являются уникальными. Попытка добавить дубликат просто игнорируется.
  • Ключ = Значение: В Set значение одновременно является и ключом. Это отличает его от Map, где ключ и значение — отдельные сущности.
  • Динамический размер: Коллекция автоматически растёт при добавлении новых элементов.
  • Итерация в порядке вставки: При переборе элементов (например, в цикле for...of) они возвращаются в том порядке, в котором были добавлены.
  • Эффективность операций: Основные операции — добавление, удаление и проверка наличия (add, delete, has) — выполняются в среднем за O(1) (константное время), что делает Set очень эффективной структурой для работы с уникальными данными.

Базовый API объекта Set

// Создание нового Set
const myHashSet = new Set();

// 1. Добавление элементов - .add(value)
myHashSet.add(5);
myHashSet.add('text');
myHashSet.add({ name: 'John' });
myHashSet.add(5); // Дубликат - не будет добавлен
console.log(myHashSet.size); // 3

// 2. Проверка наличия - .has(value)
console.log(myHashSet.has(5)); // true
console.log(myHashSet.has(10)); // false

// 3. Удаление элемента - .delete(value)
myHashSet.delete('text');
console.log(myHashSet.has('text')); // false

// 4. Полное очищение - .clear()
// myHashSet.clear(); // Удалит все элементы

// 5. Размер коллекции - .size
console.log(myHashSet.size); // 2

Основные преимущества и сценарии использования

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

    const duplicateArray = [1, 2, 2, 3, 4, 4, 5];
    const uniqueArray = [...new Set(duplicateArray)];
    console.log(uniqueArray); // [1, 2, 3, 4, 5]
    
  2. Эффективная проверка на уникальность. Проверка set.has(value) выполняется значительно быстрее, чем array.includes(value) для больших массивов, особенно если проверок много.

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

    const divSet = new Set();
    const div1 = document.querySelector('#div1');
    const div2 = document.querySelector('#div2');
    divSet.add(div1);
    divSet.add(div1); // Не добавится повторно
    divSet.add(div2);
    
  4. Математические операции над множествами (объединение, пересечение, разность).

    const setA = new Set([1, 2, 3]);
    const setB = new Set([3, 4, 5]);
    
    // Объединение
    const union = new Set([...setA, ...setB]); // {1, 2, 3, 4, 5}
    
    // Пересечение
    const intersection = new Set([...setA].filter(x => setB.has(x))); // {3}
    
    // Разность (A - B)
    const difference = new Set([...setA].filter(x => !setB.has(x))); // {1, 2}
    

Важные особенности для понимания

  • Сравнение значений: Уникальность определяется алгоритмом «SameValueZero». Это значит, что NaN считается равным NaN (в отличие от ===), а -0 и +0 считаются равными. Разные объекты — всегда разные, даже если их содержимое идентично.

    const set = new Set();
    set.add(NaN);
    set.add(NaN); // Не добавится - NaN === NaN внутри Set!
    console.log(set.size); // 1
    
    set.add({});
    set.add({}); // Добавится оба объекта - это разные ссылки
    console.log(set.size); // 3
    
  • Итерация: Set является итерируемым объектом, имеет методы keys(), values() (они идентичны для Set) и entries() (возвращает [value, value]).

    const iterSet = new Set(['a', 'b', 'c']);
    for (let item of iterSet) {
        console.log(item); // 'a', 'b', 'c'
    }
    // Аналогично:
    iterSet.forEach((value) => console.log(value));
    
  • Производительность vs Массив: Использование Set для проверки существования элемента предпочтительнее массива, когда важна скорость. Однако, если важен порядок и нужны частые операции по индексу, массив может быть лучше.

Взаимодействие с массивами и обратно

// Массив -> Set
const arr = [1, 2, 3];
const setFromArray = new Set(arr);

// Set -> Массив
const arrayFromSet = [...setFromArray];
// или
const arrayFromSet2 = Array.from(setFromArray);

Заключение

HashSet, реализуемый в JavaScript через объект Set, — это фундаментальная структура данных для работы с коллекциями уникальных значений. Его сила — в простоте API, предсказуемом порядке итерации и, что критически важно, в высокой производительности основных операций. Понимание и грамотное применение Set позволяет писать более чистый, эффективный и выразительный код, особенно в задачах дедупликации, проверки членства и математических операций над множествами. Это обязательный инструмент в арсенале современного Frontend-разработчика.

Что такое HashSet? | PrepBro