Почему в WeakMap value не удаляется, когда выводишь всю коллекцию, но удаляется, когда при выводе одного эл-та?

Везде пишется про ключ WeakMap:

  1. Ключом в этой структуре данных может быть только объект
  2. 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 пуст

Надеюсь, что я сам где-нибудь не ошибся в нюансах, если что, меня поправят.

→ Ссылка