Ответ
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), то есть чем массив больше, тем дольше всё ебётся. Вот и вся разница, понимаешь?
Видео-ответы
▶
▶
▶
▶
▶
▶