Set и WeakSet — это оба коллекции для хранения уникальных значений, но у них есть важные отличия:
// Set — хранит любые значения
const set = new Set([1, 2, 'hello', {}]);
// WeakSet — только объекты
const obj = {};
const weakSet = new WeakSet([obj]);Представь, что Set — это обычный ящик, куда можно складывать что угодно: игрушки, книги, одежду. А WeakSet — это магический ящик, который сам выбрасывает вещи, когда они никому больше не нужны! 📦✨
// Set может хранить всё
const set = new Set();
set.add(1); // число ✅
set.add('text'); // строка ✅
set.add({}); // объект ✅
// WeakSet только объекты
const weakSet = new WeakSet();
// weakSet.add(1); // ❌ Ошибка!
// weakSet.add('text'); // ❌ Ошибка!
weakSet.add({}); // ✅ Только объектыconst set = new Set([1, 2, 3]);
// Set можно перебирать
for (const item of set) {
console.log(item); // 1, 2, 3
}
const weakSet = new WeakSet([{a: 1}, {b: 2}]);
// ❌ WeakSet нельзя перебирать!
// for (const item of weakSet) // Ошибка!WeakSet — как друг, который помнит только тех людей, с которыми ты всё ещё общаешься. Если человек ушёл из твоей жизни (никто больше не держит на него ссылку), WeakSet сам забудет о нём! 🧠
let obj = { name: 'Иван' };
const weakSet = new WeakSet([obj]);
// Когда obj больше никем не используется
obj = null;
// Объект автоматически удалится из WeakSet
// Сборщик мусора позаботится об этом 🗑️// Уникальные пользователи
const uniqueUsers = new Set();
// Уникальные теги
const tags = new Set(['js', 'css', 'html', 'js']);
// Будет только ['js', 'css', 'html']// Нужно пройтись по всем элементам
const numbers = new Set([1, 2, 3]);
numbers.forEach(num => {
console.log(num); // 1, 2, 3
});// Отслеживаем уже обработанные объекты
const processed = new WeakSet();
function process(obj) {
if (processed.has(obj)) {
return 'уже обработан';
}
processed.add(obj);
return 'обработан';
}// Проверяем, не обрабатывали ли мы этот узел
const visited = new WeakSet();
function traverse(node) {
if (visited.has(node)) {
return; // Уже были здесь
}
visited.add(node);
// Обрабатываем узел...
}// ❌ Ошибка!
const weakSet = new WeakSet();
// weakSet.add('строка'); // TypeError!
// weakSet.add(123); // TypeError!
// ✅ Правильно
const obj = {};
weakSet.add(obj); // Только объекты!// ❌ Нельзя перебирать WeakSet
const weakSet = new WeakSet([{a: 1}]);
// weakSet.forEach(item => {}); // Ошибка!Понимание разницы между Set и WeakSet помогает выбрать правильный инструмент для решения задачи и избежать проблем с памятью! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪