Skip to main content

WeakMap VS Map

Різниця між Map та WeakMap у JavaScript фундаментальна. Обидва зберігають пари «ключ -> значення», але WeakMap створений для особливих випадків, коли потрібно "пов'язувати дані з об'єктами", не заважаючи збирачу сміття (GC).


Головна ідея:

ВластивістьMapWeakMap
Ключібудь-які значення (рядки, числа, об'єкти)тільки об'єкти
Тип посиланьсильні (об'єкт живе, поки є посилання)слабкі (GC може видалити об'єкт)
Перебір (for...of, .keys(), .size)єнемає
Перевірка розміру.sizeнемає
Використанняуніверсальні пари ключ-значеннятимчасові "прив'язки" до об'єктів

Приклад з Map:

javascript
const map = new Map(); let user = { name: "Alice" }; map.set(user, "Користувач"); console.log(map.get(user)); // "Користувач" user = null; // видаляємо посилання console.log(map); // Map все ще зберігає { name: "Alice" }

Об'єкт не буде видалений з пам'яті, поки Map зберігає посилання на нього -> витік пам'яті.


Тепер WeakMap:

javascript
const weakMap = new WeakMap(); let user = { name: "Alice" }; weakMap.set(user, "Користувач"); console.log(weakMap.has(user)); // true user = null; // об'єкт стає недосяжним // об'єкт буде автоматично видалений збирачем сміття!
  • Якщо об'єкт більше не досяжний з коду, збирач сміття видалить і сам об'єкт, і його запис у WeakMap.
  • WeakMap не перешкоджає очищенню пам'яті.

Що означає "слабке посилання"?

"Слабке" посилання - це посилання, яке не заважає збирачу сміття видалити об'єкт, якщо на нього немає інших "сильних" посилань.

У звичайній Map ключі зберігаються "сильно" - поки Map існує, усі ключі та значення залишаться в пам'яті. У WeakMap - ні: GC може очистити їх у будь-який момент.


Методи WeakMap:

МетодОпис
set(key, value)додати значення для об'єкта
get(key)отримати значення
has(key)перевірити наявність
delete(key)видалити запис

Немає: size, keys(), values(), entries(), forEach()

  • тому що WeakMap неперебірна.

Приклад практичного використання:

Зберігання приватних даних для об'єктів

javascript
const privateData = new WeakMap(); class User { constructor(name, age) { privateData.set(this, { age }); this.name = name; } getAge() { return privateData.get(this).age; } } const alice = new User("Alice", 30); console.log(alice.getAge()); // 30 // Після видалення alice об'єкт і його приватні дані зникнуть з пам'яті
  • Приватні дані не видно ззовні,
  • автоматично очищаються при видаленні об'єкта.

Ще приклад - кешування:

javascript
const cache = new WeakMap(); function getData(obj) { if (!cache.has(obj)) { const data = Math.random(); // припустимо, дорого обчислювати cache.set(obj, data); } return cache.get(obj); } let user = {}; console.log(getData(user)); // створюється кеш user = null; // об'єкт і його кеш автоматично очищаються

Ідеально для тимчасового зберігання обчислених даних, без витоків пам'яті.


Коротко:

ВластивістьMapWeakMap
Тип ключівбудь-якийтільки об'єкти
Перебір елементівєнемає
Зв'язок з об'єктамисильнийслабкий
Автоматичне видаленнянемаєтак
Застосуваннякеш, словники, конфігиприватні дані, кеш без витоків

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.