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

Ответ

Set — это встроенная коллекция в JavaScript, которая хранит только уникальные значения любого типа (примитивы, объекты, функции). Основное отличие от массива — автоматическое устранение дубликатов и быстрая проверка наличия элемента.

Ключевые особенности:

  • Порядок элементов соответствует порядку добавления.
  • Нет индексов, доступ через методы: add(), has(), delete(), clear().
  • Итерируем с помощью for...of или методов forEach(), keys(), values(), entries().

Пример использования в Node.js:

const uniqueTags = new Set();
uniqueTags.add('nodejs');
uniqueTags.add('javascript');
uniqueTags.add('nodejs'); // Не добавится, дубликат

console.log(uniqueTags.size); // 2
console.log(uniqueTags.has('javascript')); // true

// Удаление дубликатов из массива — частая практика
const duplicateIds = [101, 102, 101, 103, 102];
const uniqueIds = [...new Set(duplicateIds)];
console.log(uniqueIds); // [101, 102, 103]

// Использование в контексте валидации
function validateUniqueEmails(emails) {
  const emailSet = new Set(emails);
  if (emailSet.size !== emails.length) {
    throw new Error('Обнаружены дублирующиеся email-адреса');
  }
  return Array.from(emailSet);
}

Почему это важно: Set обеспечивает алгоритмическую сложность O(1) для операций добавления, удаления и проверки наличия, что делает его значительно эффективнее аналогичных операций с массивом (includes() имеет O(n)).

Ответ 18+ 🔞

А, Set! Ну это ж, ёпта, такая штука в JavaScript, которая как хитрая жопа — внутрь можно что угодно пихать, но одинаковое дважды не влезет. По сути, коллекция, которая хранит только уникальные значения — хоть строки, хоть цифры, хоть целые объекты.

В чём прикол, если коротко:

  • Порядок элементов — такой же, как ты их засовывал. Не как в том бардаке, который Object иногда устроит.
  • Индексов тут нет, блядь, совсем. Не массива. Работаешь через методы: add() (запихнуть), has() (а есть ли?), delete() (выкинуть) и clear() (очистить всё, ебать копать).
  • Перебрать можно через for...of или всякие forEach(), keys(), values().

Смотри, как в Node.js это выглядит на практике:

const uniqueTags = new Set();
uniqueTags.add('nodejs');
uniqueTags.add('javascript');
uniqueTags.add('nodejs'); // Этот уже не добавится, дубль же, мудя!

console.log(uniqueTags.size); // 2
console.log(uniqueTags.has('javascript')); // true

// Классика жанра — убрать дубли из массива. Делается в одну строку, ядрёна вошь!
const duplicateIds = [101, 102, 101, 103, 102];
const uniqueIds = [...new Set(duplicateIds)];
console.log(uniqueIds); // [101, 102, 103]

// Или вот, допустим, валидация email'ов, чтобы один и тот же мудак дважды не регистрировался.
function validateUniqueEmails(emails) {
  const emailSet = new Set(emails);
  if (emailSet.size !== emails.length) {
    throw new Error('Обнаружены дублирующиеся email-адреса');
  }
  return Array.from(emailSet);
}

А главная фишка в чём? Алгоритмическая сложность, чувак! У Set операции добавления, удаления и проверки (add, delete, has) — это O(1), почти мгновенно. А если бы ты то же самое через массив с includes() делал, это было бы O(n), то есть чем массив больше, тем дольше всё ебётся. Вот и вся разница, понимаешь?