← Назад ко всем вопросам

В чем разница между Map, Set, WeakMap, WeakSet

1️⃣ Как кратко ответить

Map — это коллекция пар ключ-значение, где ключи могут быть любого типа. Set — это коллекция уникальных значений любого типа. WeakMap — это коллекция пар ключ-значение, где ключи должны быть объектами, и они могут быть удалены сборщиком мусора, если больше нигде не используются. WeakSet — это коллекция уникальных объектов, которые также могут быть удалены сборщиком мусора, если больше нигде не используются.

2️⃣ Подробное объяснение темы

Map, Set, WeakMap и WeakSet — это структуры данных, которые предоставляют различные способы хранения и управления коллекциями данных в JavaScript.

Map

Map — это коллекция, которая хранит пары ключ-значение. В отличие от обычных объектов, ключи в Map могут быть любого типа, включая объекты, функции и примитивы.

const map = new Map();
map.set('key1', 'value1'); // Устанавливаем строку в качестве ключа
map.set({}, 'value2'); // Устанавливаем объект в качестве ключа
map.set(() => {}, 'value3'); // Устанавливаем функцию в качестве ключа
​
console.log(map.get('key1')); // 'value1'
  • set(key, value): добавляет пару ключ-значение.
  • get(key): возвращает значение, связанное с ключом.
  • delete(key): удаляет пару по ключу.
  • has(key): проверяет наличие ключа.
  • size: возвращает количество элементов.

Set

Set — это коллекция уникальных значений. Значения могут быть любого типа, но каждое значение может присутствовать только один раз.

const set = new Set();
set.add(1); // Добавляем число
set.add('text'); // Добавляем строку
set.add(1); // Игнорируется, так как 1 уже есть в Set
​
console.log(set.has(1)); // true
console.log(set.size); // 2
  • add(value): добавляет значение.
  • delete(value): удаляет значение.
  • has(value): проверяет наличие значения.
  • size: возвращает количество элементов.

WeakMap

WeakMap похож на Map, но ключи должны быть объектами, и они могут быть удалены сборщиком мусора, если больше нигде не используются. Это полезно для хранения данных, связанных с объектами, без предотвращения их удаления.

let obj = {};
const weakMap = new WeakMap();
weakMap.set(obj, 'value');
​
console.log(weakMap.get(obj)); // 'value'
​
obj = null; // Теперь объект может быть удален сборщиком мусора
  • set(key, value): добавляет пару ключ-значение.
  • get(key): возвращает значение, связанное с ключом.
  • delete(key): удаляет пару по ключу.
  • has(key): проверяет наличие ключа.

WeakSet

WeakSet — это коллекция уникальных объектов. Как и в WeakMap, объекты могут быть удалены сборщиком мусора, если больше нигде не используются.

let obj1 = {};
let obj2 = {};
const weakSet = new WeakSet();
weakSet.add(obj1);
weakSet.add(obj2);
​
console.log(weakSet.has(obj1)); // true
​
obj1 = null; // Теперь obj1 может быть удален сборщиком мусора
  • add(value): добавляет объект.
  • delete(value): удаляет объект.
  • has(value): проверяет наличие объекта.

Применение и особенности

  • Map и Set полезны, когда требуется работа с коллекциями данных, где важны типы ключей или уникальность значений.
  • WeakMap и WeakSet полезны для управления памятью, когда необходимо хранить данные, связанные с объектами, без предотвращения их удаления сборщиком мусора. Это особенно актуально в случаях, когда объекты могут быть временными и не должны удерживаться в памяти дольше, чем необходимо.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки