@Sector567

Как работает Map и WeakMap?

Вот откуда взят пример https://fooobar.com/questions/28095/whats-the-diff...
И вроде бы там объясняется, но не до конца.

Почему "console.log(map.get(k1)); " и "console.log(map.get({a: 1}));" выводит "underfined", несмотря на то, что выше в цикле четко видно, что ключи "{a: 1}" существует
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}
});

console.log(map.get(k1)); // ?
console.log(map.get({a: 1})); // ?


k2 = null;
console.log(wm.get(k2)); // undefined
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
@vladdimir
Верстальщик
Вы же знаете, что объекты по ссылкам хранятся?
map.get(k1) // ссылается на тот же объект, которым вы задали значение в set
map.get({a:1}) // уже совершенно другой объект

{a:1}, {a:1} // это два разных объекта
map.set({a:2}, 'oops') // вы не сможете достать или удалить это значение, потому как единственная 
//ссылка на ключ лежит в самом Мапе

Почитайте больше о том, как работают объекты.

Поправка, вы можете достать подобный ключ, например так:
for (let key of map.keys()) {
  console.log(map.get(key))
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
kocherman
@kocherman
WeakMap получает в качестве ключа только объект. Причем, WeakMap не удерживает объект. Если объект удалить из всех мест, ссылка на него из WeakMap тоже перестанет работать, а сами данные удалятся сборщиком мусора.
Ответ написан
alekseyHunter
@alekseyHunter
Android developer
Ты не удаляешь элемент в map по ключу, ты обнуляешь ссылку на объект k1.
Для удаления элемента по ключу, вызови в map соответствующий метод.
const map1 = new Map();
map1.set('bar', 'foo');

console.log(map1.delete('bar'));
// expected result: true
// (true indicates successful removal)

console.log(map1.has('bar'));
// expected result: false
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы