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