Задать вопрос
@Ivanushka255

Почему когда я обнуляю value в коллекции WeakMap, value остается прежним?

Я думаю, что если я обнуляю значение, оно должно быть null (логично же). Value не должно оставаться прежним. Если я прав, то почему значение в моем примере остается прежним после обнуления? В чем причина такого поведения?

Вот мой пример:
let weakMap = new WeakMap();
let value = {name: 'Ivan'};
let key = {};

//добавление нового элемента
weakMap.set(key, value);
//обнуление value
value = null;
console.log(weakMap.get(key)); //{name: 'Ivan'} --> почему здесь не null?
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
если убрать весь пафос WeakMap, с простыми переменными всё точно так же:
let value = { name: 'iOne' };
let x = value; // ещё одна "ссылка" на объект

value = null; // или  delete value; – то же самое
x //  { name: "iOne" }
Разберитесь с основами: Объекты и ссылки на объекты. Т.к. в объекте weakMap есть ссылка от ключа на объект-значение — объект вполне себе сохраняется. Главное, что всё ещё жива ссылка на объект-ключ key.

Особенность WeakMap  – в тех объектах, которые выступают не значениями, а ключами.
const weakMap = new WeakMap();
let value = {name: 'Ivan'};
let key = {};

// добавление нового элемента
weakMap.set(key, value);

// обнуление
delete key;
Теперь, хоть объект, на который указывала переменная key всё ещё используется в качестве ключа в WeakMap, сборщик мусора, при срабатывании, таки удалит его.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
s3ttlezy
@s3ttlezy
micro frontender
Попробуйте обнулить ключ, а не значение
let obj = { name: "weakmap" }

const map = new WeakMap([
  [obj, "value"]
])

obj = null
console.log(map.get(obj))
Ответ написан
Ваш ответ на вопрос

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

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