WeakMap и HTMLElement в DOM

Работа WeakMap понятна, но при попытке удалить узел из браузера в WeakMap этот же узел не удаляется.

Код примерно такой:

let weakList = new WeakMap(), /// Пусто
    element = $0; /// $0 для выделения любого элемента на странице

weakList.set(element, true);
console.log(weakList); /// Не пусто

element.remove();
element = null;
console.log(weakList); /// Не пусто

Как решить этот вопрос?


Ответы (3 шт):

Автор решения: DiD

Вы удаляете элемент, но не выбрасываете его из значения переменной.

const map = new WeakMap();
let element = document.querySelector('span');
map.set(element,element.innerText);
console.log(map.get(element)); // элемент тут
element.remove();
console.log(map.get(element)); // всё ещё тут
element = null;
console.log(map.get(element)); // пропал!
<p>
  Text1
  <span>
    Text2
  </span>
  Text3
</p>

→ Ссылка
Автор решения: Aziz Umarov

Не много не так поскольку в данном случае его там нет тоже.

const map = new WeakMap();
let element = document.querySelector('span');
map.set(element,element.innerText);
console.log(map.get(element)); // элемент тут
element = null;
console.log(map.has(element));
<p>
  Text1
  <span>
    Text2
  </span>
  Text3
</p>
WeakMap нужно немного постараться чтобы сделать валидный пример.

→ Ссылка
Автор решения: Alexey Ten

Никто никогда не обещал, что WeakMap очистится мгновенно. WeakMap всего лишь не будет мешать Garbage Collector-у убрать ненужные объекты.

Стандартом специально не предусмотрена возможность посмотреть что лежит внутри WeakMap, так что вывод console.log(weakList) это чистая самодеятельность браузера.

Более того, ваш вывод weakList в консоль добавил ссылку на объект (в консоли вы можете посмотреть его свойства и т.п.), так что GC его и не соберёт.

→ Ссылка