WeakMap. В чём особенность? Какие свойства и методы есть? Как перебрать?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Сложный
#JavaScript #Коллекции #База JS

Краткий ответ

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:

Простые примеры

Создание и основные методы

// Создание 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)); // false

Автоматическая очистка

let obj = {};
const weakMap = new WeakMap();
 
weakMap.set(obj, 'данные');
 
// Когда obj больше не используется
obj = null;
 
// Объект и его данные будут автоматически удалены
// сборщиком мусора (в какой-то момент)

Свойства и методы WeakMap

Основные методы

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()!

Почему нельзя перебрать WeakMap

Нет перебора!

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!

Когда использовать WeakMap

Для приватных данных

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) => {}); // Ошибка!

Простые правила

  1. Только объекты — ключами могут быть только объекты 🗝️
  2. Слабые ссылки — объекты автоматически удаляются сборщиком мусора 🗑️
  3. Нет перебора — нельзя перебрать, нет keys(), values(), entries() 🚫
  4. Нет size — нет свойства для получения количества элементов 🚫
  5. Приватность — удобно для хранения приватных данных 🔐

WeakMap — отличный инструмент для хранения данных, связанных с объектами, без риска утечек памяти! 💪


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪