Вопрос проверяет понимание слабых ссылок, сборки мусора и сценариев управления памятью.
WeakMap отличается тем, что его ключи могут быть только объектами, и они хранятся как слабые ссылки. Если на объект-ключ больше нет сильных ссылок, он удаляется сборщиком мусора вместе со значением. В WeakMap нельзя итерироваться по элементам и узнать размер. Map таких ограничений не имеет и удерживает данные в памяти.
Основное различие между Map и WeakMap — это влияние на управление памятью.
WeakMap — коллекция пар ключ–значение, где ключи являются объектами и не препятствуют их сборке мусора.
Ключи — только объекты.
Нет методов:
keys()
values()
entries()
size
Нельзя итерироваться.
const weakMap = new WeakMap();
let user = { name: "Ann" };
weakMap.set(user, "metadata");
user = null;
// объект может быть удалён сборщиком мусора
Объекты могут быть удалены в любой момент.
JS-движок не обязан сообщать, когда именно это произойдет.
Итерация нарушила бы абстракцию сборки мусора.
Хранение метаданных, связанных с объектами.
Кэш, который не должен приводить к утечкам памяти.
Приватные данные, привязанные к экземплярам.
const privateData = new WeakMap();
function User(name) {
privateData.set(this, { name });
}
User.prototype.getName = function () {
return privateData.get(this).name;
};
Нужна итерация по данным.
Ключи — примитивы.
Важно явно управлять временем жизни данных.
WeakMap используют для безопасной работы с памятью и объектами, а Map — для универсальных коллекций с полным доступом и итерацией.