WeakSet и WeakMap — это специальные коллекции в JavaScript, которые похожи на Set и Map, но с важными отличиями, связанными с управлением памятью и сборкой мусора.
Какие типы данных могут использоваться в качестве ключей Map и WeakMap, в чём различия?
WeakSet и WeakMap — это специальные коллекции в JavaScript, которые похожи на Set и Map, но с важными отличиями, связанными с управлением памятью и сборкой мусора.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
WeakSet и WeakMap — это специальные коллекции в JavaScript, которые похожи на Set и Map, но с важными отличиями, связанными с управлением памятью и сборкой мусора.
Ключевые отличия:
- Слабые ссылки: WeakSet и WeakMap хранят объекты слабыми ссылками. Это значит, что если объект, который находится в WeakSet или является ключом в WeakMap, больше нигде не используется, он может быть автоматически удалён сборщиком мусора.
- Только объекты: В WeakSet и WeakMap ключами (или элементами) могут быть только объекты, примитивы использовать нельзя.
- Отсутствие методов перебора: В WeakSet и WeakMap нет методов для перебора элементов (например, forEach, keys, values), потому что содержимое может изменяться асинхронно из-за сборки мусора.
- Использование: WeakMap часто используется для хранения приватных данных, связанных с объектами, без риска утечки памяти.
Пример:
let wm = new WeakMap();
let obj = {};
wm.set(obj, 'данные');
obj = null; // теперь объект может быть удалён сборщиком мусора, и данные в WeakMap тоже исчезнут
В отличие от Map и Set, которые хранят сильные ссылки и предотвращают удаление объектов, WeakMap и WeakSet позволяют сборщику мусора освобождать память, если объекты больше не используются в других местах.