WeakMap — это специальная версия Map, которая хранит ключи “слабо”. Это означает, что если объект-ключ больше нигде не используется, сборщик мусора может удалить его вместе со значением из WeakMap. Ключами могут быть только объекты.
const weakMap = new WeakMap();
const obj = {};
weakMap.set(obj, 'значение');
console.log(weakMap.get(obj)); // 'значение'
// Нельзя перебрать!
// for (const [key, value] of weakMap) // Ошибка!WeakMap — как волшебный шкаф, который сам очищается, когда вещи в нём больше никому не нужны! Если вы положили что-то в шкаф, но никто больше не помнит об этом предмете, шкаф сам выбросит его. Это помогает избежать утечек памяти! 🧙
Главные особенности WeakMap:
// Создание WeakMap
const privateData = new WeakMap();
// Объекты как ключи
const user1 = { name: 'Иван' };
const user2 = { name: 'Петр' };
// Добавление данных
privateData.set(user1, { password: '123' });
privateData.set(user2, { password: '456' });
// Получение данных
console.log(privateData.get(user1)); // { password: '123' }
// Проверка наличия
console.log(privateData.has(user1)); // true
// Удаление
privateData.delete(user1);
console.log(privateData.has(user1)); // falselet obj = {};
const weakMap = new WeakMap();
weakMap.set(obj, 'данные');
// Когда obj больше не используется
obj = null;
// Объект и его данные будут автоматически удалены
// сборщиком мусора (в какой-то момент)const weakMap = new WeakMap();
const key = {};
// set(key, value) — добавляет пару ключ-значение
weakMap.set(key, 'значение');
// get(key) — получает значение по ключу
const value = weakMap.get(key);
// has(key) — проверяет наличие ключа
const exists = weakMap.has(key);
// delete(key) — удаляет элемент по ключу
weakMap.delete(key);
// НЕТ свойства size!
// НЕТ метода clear()!const weakMap = new WeakMap();
const obj = {};
weakMap.set(obj, 'значение');
// ❌ Ошибка — нельзя перебрать WeakMap
// for (const [key, value] of weakMap) // TypeError!
// ❌ Ошибка — нет методов keys(), values(), entries()
// weakMap.keys(); // TypeError!
// ❌ Ошибка — нет forEach
// weakMap.forEach(); // TypeError!const privateData = new WeakMap();
class User {
constructor(name) {
this.name = name;
// Приватные данные не видны извне
privateData.set(this, { password: 'секрет' });
}
getPassword() {
return privateData.get(this).password;
}
}const cache = new WeakMap();
function processData(obj) {
if (cache.has(obj)) {
return cache.get(obj); // из кэша
}
const result = heavyCalculation(obj);
cache.set(obj, result); // в кэш
return result;
}
// Когда объект obj больше не нужен,
// кэш автоматически очистится// ❌ Ошибка — только объекты как ключи
const weakMap = new WeakMap();
// weakMap.set('строка', 'значение'); // TypeError!
// weakMap.set(123, 'значение'); // TypeError!
// ✅ Правильно — только объекты
const obj = {};
weakMap.set(obj, 'значение'); // работает// ❌ Ошибка — думать, что WeakMap как Map
const weakMap = new WeakMap();
const obj = {};
weakMap.set(obj, 'значение');
// Нельзя перебрать!
// weakMap.forEach((value, key) => {}); // Ошибка!WeakMap — отличный инструмент для хранения данных, связанных с объектами, без риска утечек памяти! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪