WeakSet. В чём особенность? Какие свойства и методы есть? Как перебрать?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Сложный
#JavaScript #Коллекции #База JS

Краткий ответ

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:

Простые примеры

Создание и основные методы

// Создание 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)); // false

Автоматическая очистка

let obj = {};
const weakSet = new WeakSet();
 
weakSet.add(obj);
 
// Когда obj больше не используется
obj = null;
 
// Объект будет автоматически удалён
// сборщиком мусора (в какой-то момент)

Свойства и методы WeakSet

Основные методы

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()!

Почему нельзя перебрать WeakSet

Нет перебора!

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!

Когда использовать WeakSet

Для отслеживания объектов

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

// Обычный Set vs WeakSet
const set = new Set(); // Может хранить любые значения
const weakSet = new WeakSet(); // Только объекты
 
set.add("строка"); // ✅ Работает
// weakSet.add("строка"); // ❌ Ошибка!

Простые правила

  1. Только объекты — хранит только объекты 🗝️
  2. Слабые ссылки — объекты автоматически удаляются сборщиком мусора 🗑️
  3. Нет перебора — нельзя перебрать, нет keys(), values(), entries() 🚫
  4. Нет size — нет свойства для получения количества элементов 🚫
  5. Отслеживание — удобно для отслеживания объектов 🔍

WeakSet — отличный инструмент для отслеживания объектов без риска утечек памяти! 💪


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪