javascript - Map 的垃圾收集最近有变化吗?

标签 javascript garbage-collection weakmap

MapWeakMap 之间的主要区别(如我所想):

如果我们在 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 中看不到关于它的某种声明或我误解了什么而改变了?

最佳答案

console.log(userRoles.get(Corey)); // Undefined ??

它是 undefined 因为您的 map 中没有 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]);

关于javascript - Map 的垃圾收集最近有变化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45524371/

相关文章:

javascript - 如何从 json 文件访问 categories->tablet->desc?

objective-c - 直接释放一个对象

将对象设置为 null 时的 JavaScript(ES6) WeakMap 垃圾回收

javascript - ES6 Map 和 WeakMap 有什么区别?

javascript - 访问派生类中使用 Wea​​kMap 定义的私有(private)变量

javascript - 如何在javascript中循环数据

javascript - 为什么 Angular `ng-repeat` 有不同的复选框区分行为然后手动列出复选框?

javascript - 在 jqPlot 中滚动

python - CPython 合并排序的意外性能曲线

java.lang.OutOfMemory错误: GC overhead limit exceeded android studio