乐闻世界logo
搜索文章和话题

What 's the difference between ES6 Map and WeakMap?

7 个月前提问
5 个月前修改
浏览次数23

1个答案

1

在JavaScript ES6中,MapWeakMap都是用于存储键值对的集合,但它们之间有几个关键的区别:

  1. 键的类型

    • Map可以接受各种类型的值作为键,包括对象、基本数据类型(如数字、字符串等)。
    • WeakMap的键必须是对象,不能是其他基本的数据类型。
  2. 弱引用

    • WeakMap中的键是对对象的弱引用,这意味着如果没有其他引用指向对象,这些对象可以被垃圾回收机制回收。这种特性使得WeakMap成为管理和优化内存的好工具,特别是在涉及到大量对象和缓存时。
    • 相反,Map中的键则是强引用,只要Map实例存在,键和值都不会被垃圾回收。
  3. 可枚举性

    • Map的内容可以被迭代,你可以使用Map的方法如.keys(), .values(), 和.entries()来访问键、值或者键值对。
    • WeakMap不支持迭代和没有这些方法,也没有办法清晰地知道有多少元素在WeakMap中。这是因为对象的引用是弱引用,枚举它们会暴露垃圾收集器的状态,从而导致不确定的行为。
  4. 用途

    • Map适用于需要频繁查找的场景,可以存储额外的信息,例如用户ID与用户信息的映射。
    • WeakMap常用于缓存或存储只有当对象存在时才有意义的信息,例如,它们经常用于存储私有数据或者缓存对象,而不阻碍这些对象的垃圾回收。

例子

考虑一个场景,我们需要创建一个对象的元数据管理,其中元数据只应当在对象活动时存在。

使用WeakMap

javascript
let weakMap = new WeakMap(); let obj = {}; // 设置对象的元数据 weakMap.set(obj, { metadata: "Some data" }); console.log(weakMap.get(obj)); // 输出: { metadata: "Some data" } // 当obj不再被引用时,垃圾回收会自动清除键和值 obj = null; // weakMap现在可能为空

使用Map将不能自动清理,即使obj不再被引用,它的元数据仍会保留在Map中,这可能导致内存泄漏。

2024年6月29日 12:07 回复

你的答案