Вопрос проверяет понимание механизма сборки мусора в JavaScript и ключевое отличие WeakMap от Map, что важно для управления памятью и предотвращения утечек.
WeakMap — это коллекция в JavaScript, которая позволяет хранить пары ключ-значение, где ключами могут быть только объекты. Его главная особенность — хранение слабых ссылок на ключи. Это означает, что наличие ключа в WeakMap не удерживает этот объект в памяти.
Сборщик мусора в JavaScript периодически освобождает память, удаляя объекты, которые больше не достижимы из корня программы (например, глобального объекта). Если объект является ключом в WeakMap, но на него больше нет других (сильных) ссылок, сборщик мусора может удалить этот объект. После удаления объекта-ключа соответствующая пара ключ-значение автоматически исчезает из WeakMap.
// Создаем объект и WeakMap
let obj = { id: 1 };
const weakMap = new WeakMap();
// Сохраняем объект как ключ
weakMap.set(obj, 'секретные данные');
console.log(weakMap.has(obj)); // true
// Удаляем единственную сильную ссылку на объект
obj = null;
// Теперь сборщик мусора может удалить объект.
// Пара ключ-значение будет удалена из WeakMap.
// Проверить это напрямую нельзя, так как у WeakMap
// нет методов для итерации или получения размера.
Вывод: Используйте WeakMap, когда вам нужно ассоциировать дополнительные данные с объектами, время жизни которых управляется извне (например, DOM-узлы или объекты из сторонних библиотек), и вы хотите избежать утечек памяти. Это идеальный инструмент для сценариев, где данные должны автоматически очищаться вместе с объектом-ключом.