WeakSet — это специальная версия Set, которая хранит объекты “слабо”. Это означает, что если объект больше нигде не используется, сборщик мусора может удалить его из WeakSet. Хранит только объекты, и нельзя перебрать элементы.
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
console.log(weakSet.has(obj)); // true
// Нельзя перебрать!
// for (const item of weakSet) // Ошибка!WeakSet — как волшебный мешок, который сам очищается, когда вещи в нём больше никому не нужны! Если вы положили что-то в мешок, но никто больше не помнит об этом предмете, мешок сам выбросит его. Это помогает избежать утечек памяти! 🧙
Главные особенности WeakSet:
// Создание WeakSet
const trackedObjects = new WeakSet();
// Только объекты
const obj1 = { name: 'первый' };
const obj2 = { name: 'второй' };
// Добавление объектов
trackedObjects.add(obj1);
trackedObjects.add(obj2);
// Проверка наличия
console.log(trackedObjects.has(obj1)); // true
console.log(trackedObjects.has(obj2)); // true
// Удаление
trackedObjects.delete(obj1);
console.log(trackedObjects.has(obj1)); // falselet obj = {};
const weakSet = new WeakSet();
weakSet.add(obj);
// Когда obj больше не используется
obj = null;
// Объект будет автоматически удалён
// сборщиком мусора (в какой-то момент)const weakSet = new WeakSet();
const obj = {};
// add(value) — добавляет объект
weakSet.add(obj);
// has(value) — проверяет наличие объекта
const exists = weakSet.has(obj);
// delete(value) — удаляет объект
weakSet.delete(obj);
// НЕТ свойства size!
// НЕТ метода clear()!const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
// ❌ Ошибка — нельзя перебрать WeakSet
// for (const item of weakSet) // TypeError!
// ❌ Ошибка — нет методов keys(), values(), entries()
// weakSet.keys(); // TypeError!
// ❌ Ошибка — нет forEach
// weakSet.forEach(); // TypeError!const processedObjects = new WeakSet();
function processObject(obj) {
// Проверяем, не обрабатывали ли уже
if (processedObjects.has(obj)) {
return 'уже обработан';
}
// Обрабатываем объект
// ... логика обработки ...
// Помечаем как обработанный
processedObjects.add(obj);
return 'обработан';
}const visitedNodes = new WeakSet();
function traverse(node) {
// Не обрабатываем уже посещённые узлы
if (visitedNodes.has(node)) {
return;
}
// Помечаем как посещённый
visitedNodes.add(node);
// Обрабатываем узел
console.log('Обрабатываю:', node);
// Рекурсивно обрабатываем дочерние узлы
if (node.children) {
node.children.forEach(traverse);
}
}// ❌ Ошибка — только объекты
const weakSet = new WeakSet();
// weakSet.add('строка'); // TypeError!
// weakSet.add(123); // TypeError!
// weakSet.add(true); // TypeError!
// ✅ Правильно — только объекты
const obj = {};
weakSet.add(obj); // работает// ❌ Ошибка — думать, что WeakSet как Set
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
// Нельзя перебрать!
// weakSet.forEach(item => {}); // Ошибка!// Обычный Set vs WeakSet
const set = new Set(); // Может хранить любые значения
const weakSet = new WeakSet(); // Только объекты
set.add("строка"); // ✅ Работает
// weakSet.add("строка"); // ❌ Ошибка!WeakSet — отличный инструмент для отслеживания объектов без риска утечек памяти! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪