Возможно, следующее объяснение будет более понятным для кого-то.
var k1 = {a: 1};
var k2 = {b: 2};
var map = new Map();
var wm = new WeakMap();
map.set(k1, 'k1');
wm.set(k2, 'k2');
k1 = null;
map.forEach(function (val, key) {
console.log(key, val); // k1 {a: 1}
});
k2 = null;
wm.get(k2); // undefined
Как вы видите, после удаления клавиши k1
из памяти мы все равно можем получить доступ к ней внутри карты. В то же время удаление ключа k2
WeakMap также удаляет его из wm
по ссылке.
Вот почему WeakMap не имеет перечислимых методов типа forEach, потому что нет такой вещи, как список WeakMap ключи, это просто ссылки на другие объекты.