Почему в WeakMap value не удаляется, когда выводишь всю коллекцию, но удаляется, когда при выводе одного эл-та?
Везде пишется про ключ WeakMap:
- Ключом в этой структуре данных может быть только объект
- WeakMap не может держать ссылку на ключ-объект. При удалении ключа-объекта значение тоже удалится.
НО что насчет value? Почему в этом случае даже при "обнулении" элемент все равно выводится?
let weakMap = new WeakMap();
let obj = {name: 'Ivan'};
//добавление нового элемента
weakMap.set({}, obj);
obj = null;
console.log(weakMap);
А вот тут уже не выводится. В чем причина?
P.S. Точно такая же ситуация с key:
Ответы (1 шт):
Автор решения: Neverm1ndo
→ Ссылка
Все довольно просто, когда вы добавляете элемент в строке
weakMap.set({}, obj);
Вы создаете новый(!!!) ключ-объект {}, а потом в строке
obj = null;
вы "удаляете" даже не сам ключ, а его значение т.е value.
Чтобы удалить элемент из WeakMap, воспользуйтесь методом delete(key).
Если я правильно вас понял, то должно получиться что-то такое:
let weakMap = new WeakMap();
let obj = {name: 'Ivan'};
let key = {}; // создаем объект с возможностью сослаться на него
//добавление нового элемента
weakMap.set(key, obj); // если вместо key будет {} мы не сможем получить на этот объект ссылку
console.log(weakMap); // weakMap с 1 элементом
weakMap.delete(key); // ссылка на ключ в качестве аргумента, если мы снова вместо key будем использовать {}, то ничего не выйдет, т.к если помните {} != {}
key = null; // это уже даже не нужно будет, т.е сборщик заметит, что ссылок на эту переменную нигде нет и удалит из памяти
obj = null; // это тоже не имеет смысла в контексте данного вопроса, т.к используется в качестве значения
console.log(weakMap); // weakMap пуст
Надеюсь, что я сам где-нибудь не ошибся в нюансах, если что, меня поправят.


