Поменялась ли сборка мусора в Map недавно?
Основное различие между Map и WeakMap (как я и думал) в том, что:
Если мы сохранили объект в Map, а затем позже на этот объект не ссылаются в других местах, этот объект все равно не будет включен в процесс сбора мусора, и мы все равно сможем получить к нему доступ в Map.
Но если он хранится в WeakMap, а затем на этот объект не ссылаются где-либо еще в коде, то он будет собирать мусор.
Теперь, глядя на этот пример и вывод, который я получаю, похоже, что даже объект в Map, который больше не имеет ссылки где-то еще, теперь собирает мусор:
const userRoles = new Map();
let Corey = { name: "Corey", age: "40" };
userRoles.set(Corey, "Admin");
Corey = null;
console.log(userRoles.get(Corey)); // Undefined ??
Изменились ли спецификации, потому что я не вижу каких-либо утверждений относительно этого в MDN или я что-то неправильно понял?
1 ответ
console.log(userRoles.get(Corey)); // Undefined ??
Это undefined
потому что у вас нет записи на вашей карте для null
, Вы установили Corey
в null
и поэтому, когда вы запускаете эту строку кода, вы делаете userRoles.get(null)
,
Запись с ключом под объектом все еще там. Вы можете найти это через итерацию, keys
повторяемый и т. д.:
const userRoles = new Map();
let Corey = { name: "Corey", age: "40" };
userRoles.set(Corey, "Admin");
Corey = null;
console.log(userRoles.get(Corey)); // Undefined
console.log(Array.from(userRoles.keys())[0]);