Map 强引用键对象,阻止垃圾回收,可能导致内存泄漏;2. WeakMap 弱引用对象键,允许垃圾回收,适合关联私有数据或缓存,避免内存泄漏。
Map 和 WeakMap 的核心区别在于它们对内存管理的影响,尤其是在对象作为键时的垃圾回收行为。
Map 会阻止垃圾回收
当你使用对象作为 Map 的键时,这个对象会被强引用。即使在其他地方不再使用该对象,只要它还在 Map 中,JavaScript 引擎就不会将其从内存中清除。
这意味着:
- Map 持有的键(尤其是对象)不会被自动释放
- 可能造成内存泄漏,特别是在长期存在的 Map 中存储了大量临时对象
- 你需要手动删除不再需要的键值对来释放内存
WeakMap 允许垃圾回收
WeakMap 的键必须是对象,且对这些对象是弱引用。也就是说,如果一个对象只被 WeakMap 引用,没有其他变量指向它,那么这个对象可以被垃圾回收机制正常回收。
立即学习“Java免费学习笔记(深入)”;
关键特性包括:
- 无法遍历 WeakMap 的键、值或条目
- 不提供 clear() 方法
- 一旦作为键的对象被回收,对应的条目会自动消失
使用场景对比
假设你要为一些 DOM 节点附加数据:
- 用 Map 存储:即使页面移除了某个节点,只要 Map 还持有它,该节点就无法被释放
- 用 WeakMap 存储:当 DOM 节点被移除后,只要没有其他引用,它就会被回收,WeakMap 中对应的数据也随之消失
基本上就这些。WeakMap 更适合做私有数据关联或缓存,避免影响内存回收;而 Map 提供完整功能,但需注意手动管理生命周期。不复杂但容易忽略。
相关标签: