Devs Hive
Повернутися до всіх запитань

Що таке WeakMap, WeakSet, WeakRef?

Junior/Middle/SeniorJavaScript
Зустрічали на інтервʼю:0 користувачів

Це питання ви навряд чи почуєте напряму, бо на технічних інтерв’ю зазвичай питають класичні структури типу Map/Set. Але якщо ви ще й згадаєте WeakMap, WeakSet, WeakRef, то це майже гарантовано додасть вам кілька балів. Принаймні ви запам’ятаєтеся і дуже ймовірно, почуєте щось на кшталт: “Класно, що згадали ще й ці штуки”. Тому давайте розберемося, що це таке.

WeakMap

WeakMap - це мапа ключ → значення, схожа на звичайний Map, але з важливою різницею:

  1. ключами можуть бути тільки об’єкти
  2. ці ключі зберігаються як слабкі посилання

Що таке “слабке посилання” і навіщо воно? - У звичайному Map легко зробити ситуацію, коли об’єкт вже не потрібен, але він все одно “живе” в пам’яті, бо на нього тримається посилання як на ключ. GC (Garbage Collector) може подумати: “на цей об’єкт ще є посилання - значить, прибирати не можна”.

У WeakMap цього немає: якщо на об’єкт-ключ більше ніде немає сильних посилань, GC може прибрати об’єкт, і запис у WeakMap також зникне автоматично. Тобто, це менше шансів на memory leak. Цю структуру не можна ітерувати, тому немає: for...of, .keys(), .entries(), і навіть .size. API мінімальний: set / get / has / delete.

Типовий кейс: зберігати “приватні” дані/метадані для об’єктів (кеш, стан, підрахунки), не створюючи memory leak.

const wm =newWeakMap();let user = {name:"Ivan" };

wm.set(user, {lastSeen:Date.now() });console.log(wm.get(user));// { lastSeen: ... }

user =null; // тепер об'єкт може бути прибраний GC,// і запис у WeakMap теж пропаде автоматично

WeakSet

WeakSet - це як Set (унікальні значення), але: всередині тільки об’єкти, і вони теж зберігаються як слабкі посилання. Така сама, як і попередня структура, Set ітерувати не можна.

const visited =newWeakSet();let page = {url:"/home" };

visited.add(page);console.log(visited.has(page)); // true

page =null; // об'єкт може бути прибраний GC, і WeakSet не буде його "тримати"

Типовий кейс: позначити об’єкти (наприклад, “вже оброблено”), не заважаючи GC їх прибирати.

WeakRef

WeakRef - це обгортка, яка тримає слабке посилання на об’єкт (його ще називають target або referent). Тут логіка така: ви ніби “тримаєте ручку” на об’єкт, але не гарантуєте, що він існуватиме завжди. У будь-який момент GC може його прибрати.

let obj = {heavy:"data" };const ref =newWeakRef(obj);console.log(ref.deref());// { heavy: "data" }

obj =null; // пізніше...const maybeObj = ref.deref();console.log(maybeObj);// або об’єкт, або undefined (якщо GC вже прибрав)

Для чого: дуже обережне кешування/оптимізації, коли ви хочете “підглянути” об’єкт, але не тримати його в пам’яті насильно. Також, важливо що на WeakRef не можна покладатися як на стабільне збереження даних — deref() може повернути undefined у будь-який момент.

Зустрічав на інтервʼю?

Коментарі (0)

Увійдіть, щоб залишити коментар

Поки що немає коментарів. Будьте першим!