WeakMap VS Map
Різниця між Map та WeakMap у JavaScript фундаментальна.
Обидва зберігають пари «ключ -> значення»,
але WeakMap створений для особливих випадків, коли потрібно
"пов'язувати дані з об'єктами", не заважаючи збирачу сміття (GC).
Головна ідея:
| Властивість | Map | WeakMap |
|---|---|---|
| Ключі | будь-які значення (рядки, числа, об'єкти) | тільки об'єкти |
| Тип посилань | сильні (об'єкт живе, поки є посилання) | слабкі (GC може видалити об'єкт) |
Перебір (for...of, .keys(), .size) | є | немає |
| Перевірка розміру | .size | немає |
| Використання | універсальні пари ключ-значення | тимчасові "прив'язки" до об'єктів |
Приклад з Map:
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:
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неперебірна.
Приклад практичного використання:
Зберігання приватних даних для об'єктів
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 об'єкт і його приватні дані зникнуть з пам'яті- Приватні дані не видно ззовні,
- автоматично очищаються при видаленні об'єкта.
Ще приклад - кешування:
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; // об'єкт і його кеш автоматично очищаютьсяІдеально для тимчасового зберігання обчислених даних, без витоків пам'яті.
Коротко:
| Властивість | Map | WeakMap |
|---|---|---|
| Тип ключів | будь-який | тільки об'єкти |
| Перебір елементів | є | немає |
| Зв'язок з об'єктами | сильний | слабкий |
| Автоматичне видалення | немає | так |
| Застосування | кеш, словники, конфіги | приватні дані, кеш без витоків |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.