Це питання ви навряд чи почуєте напряму, бо на технічних інтерв’ю зазвичай питають класичні структури типу Map/Set. Але якщо ви ще й згадаєте WeakMap, WeakSet, WeakRef, то це майже гарантовано додасть вам кілька балів. Принаймні ви запам’ятаєтеся і дуже ймовірно, почуєте щось на кшталт: “Класно, що згадали ще й ці штуки”. Тому давайте розберемося, що це таке.
WeakMap
WeakMap - це мапа ключ → значення, схожа на звичайний Map, але з важливою різницею:
- ключами можуть бути тільки об’єкти
- ці ключі зберігаються як слабкі посилання
Що таке “слабке посилання” і навіщо воно? - У звичайному Map легко зробити ситуацію, коли об’єкт вже не потрібен, але він все одно “живе” в пам’яті, бо на нього тримається посилання як на ключ. GC (Garbage Collector) може подумати: “на цей об’єкт ще є посилання - значить, прибирати не можна”.
У WeakMap цього немає: якщо на об’єкт-ключ більше ніде немає сильних посилань, GC може прибрати об’єкт, і запис у WeakMap також зникне автоматично. Тобто, це менше шансів на memory leak. Цю структуру не можна ітерувати, тому немає: for...of, .keys(), .entries(), і навіть .size. API мінімальний: set / get / has / delete.
Типовий кейс: зберігати “приватні” дані/метадані для об’єктів (кеш, стан, підрахунки), не створюючи memory leak.
WeakSet
WeakSet - це як Set (унікальні значення), але: всередині тільки об’єкти, і вони теж зберігаються як слабкі посилання. Така сама, як і попередня структура, Set ітерувати не можна.
Типовий кейс: позначити об’єкти (наприклад, “вже оброблено”), не заважаючи GC їх прибирати.
WeakRef
WeakRef - це обгортка, яка тримає слабке посилання на об’єкт (його ще називають target або referent). Тут логіка така: ви ніби “тримаєте ручку” на об’єкт, але не гарантуєте, що він існуватиме завжди. У будь-який момент GC може його прибрати.
Для чого: дуже обережне кешування/оптимізації, коли ви хочете “підглянути” об’єкт, але не тримати його в пам’яті насильно. Також, важливо що на WeakRef не можна покладатися як на стабільне збереження даних — deref() може повернути undefined у будь-який момент.