WeakMap 和 Map 的区别是什么?

· 约 5 分钟读完 · 第 77 / 142 章

推荐答案

WeakMap 和 Map 的主要区别在于:

  1. 键的类型:

    • Map 的键可以是任意类型的值(包括对象、原始值等)。
    • WeakMap 的键只能是对象(即引用类型),不能是原始值。
  2. 垃圾回收:

    • Map 中的键是强引用的,即使键对象在其他地方没有被引用,Map 仍然会持有该对象的引用,阻止其被垃圾回收。
    • WeakMap 中的键是弱引用的,如果键对象在其他地方没有被引用,WeakMap 不会阻止垃圾回收机制回收该对象。
  3. 可枚举性:

    • Map 是可枚举的,可以通过 for...of 或 forEach 等方法遍历其键值对。
    • WeakMap 是不可枚举的,无法直接遍历其键值对。
  4. API 差异:

    • Map 提供了丰富的 API,如 size 属性、keys()、values()、entries() 等方法。
    • WeakMap 的 API 较为有限,仅支持 set()、get()、has() 和 delete() 方法。

本题详细解读

1. 键的类型

  • Map:Map 的键可以是任意类型的值,包括对象、字符串、数字等。例如:

  • WeakMap:WeakMap 的键只能是对象,不能是原始值。例如:

2. 垃圾回收

  • Map:Map 中的键是强引用的,即使键对象在其他地方没有被引用,Map 仍然会持有该对象的引用,阻止其被垃圾回收。例如:

  • WeakMap:WeakMap 中的键是弱引用的,如果键对象在其他地方没有被引用,WeakMap 不会阻止垃圾回收机制回收该对象。例如:

3. 可枚举性

  • Map:Map 是可枚举的,可以通过 for...of 或 forEach 等方法遍历其键值对。例如:

  • WeakMap:WeakMap 是不可枚举的,无法直接遍历其键值对。例如:

4. API 差异

  • Map:Map 提供了丰富的 API,如 size 属性、keys()、values()、entries() 等方法。例如:

  • WeakMap:WeakMap 的 API 较为有限,仅支持 set()、get()、has() 和 delete() 方法。例如: