Коротка відповідь
juniorWeakMap — це колекція, що зберігає ключі‑об’єкти за слабим посиланням; коли об’єкт‑ключ втрачає всі сильні посилання, відповідна пара видаляється. WeakSet працює аналогічно, але зберігає лише об’єкти без значень. На відміну від Map/Set, WeakMap/WeakSet не підтримують ітерацію й не зберігають об’єкти, що дозволяє уникнути утримання пам’яті.
Повне пояснення
Що це і навіщо
- WeakMap: колекція, що зберігає ключ‑об’єкт → значення. Ключі мають слабке посилання; коли об’єкт‑ключ не має жодного сильного посилання, пара автоматично видаляється.
- WeakSet: колекція лише об’єктів, без значень. Також використовує слабке посилання на елементи.
Ключові принципи/терміни
- Weak reference – посилання, яке не запобігає збірці сміття.
- Garbage collection – процес, коли JS‑двигун видаляє об’єкти без сильних посилань.
- No iteration – колекції не мають
forEach,[Symbol.iterator]тощо.
Як це працює
- При створенні
new WeakMap()/WeakSet()внутрішньо зберігається таблиця, де ключі – об’єкти. Якщо об’єкт‑ключ втрачає всі сильні посилання, збірник сміття видаляє його з таблиці.
Практика і реалізація
const wm = new WeakMap();
const obj = {};
wm.set(obj, 'value'); // зберігаємо
obj = null; // тепер об’єкт без сильних посилань, пара видаляється
const ws = new WeakSet();
ws.add({ id: 1 }); // об’єкт зберігається, але не можна ітерувати
Тестування
- Тести на автоматичне видалення можна писати з
jest+jsdom, перевіряючи, що післяnullключа значення недоступне.
Особливості в контексті JS Core
- Використовуються для кешування метаданих, приватних полів, або як «підсумковий» контейнер у бібліотеках.
Оптимізація, типові помилки та edge cases
- Невірне використання: спроба ітерувати → TypeError.
- Пам’ятайте, що ключі/елементи повинні бути об’єктами; примітиви не працюють.
- Якщо потрібно ітерувати, використовуйте
Map/Set.
Часті помилки (8)
- Використання примітиву як ключа → TypeError.
- Очікування ітерації → TypeError.
- Зберігання об’єкта, який швидко зникає → неможливість отримати значення.
- Неочікуване видалення через GC → непередбачувана поведінка.
- Зберігання великої кількості об’єктів у WeakMap → збільшення GC‑нагрузки.
- Підключення до об’єкта після видалення → ReferenceError.
- Спроба отримати
size→ undefined. - Використання WeakMap як глобального кешу без контролю життєвого циклу.
Cheatsheet + follow‑up питання
- Чому WeakMap/WeakSet потрібні? – для уникнення утримання пам’яті.
- Чи можна отримати
size? – ні, колекція не підтримує. - Як перевірити наявність ключа? –
wm.has(obj). - Чи можна видалити елемент? – так,
wm.delete(obj). - Чи можна зберігати функції? – так, вони об’єкти.
- Чи можна зберігати масив? – так, як об’єкт.
- Чи можна зберігати
null? – ні, це примітив. - Чи можна зберігати
undefined? – ні, це примітив.