WeakMap 和 Map 的区别是什么?

推荐答案

WeakMap 和 Map 的主要区别在于:

  1. 键的类型

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

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

    • Map 是可枚举的,可以通过 for...offorEach 等方法遍历其键值对。
    • 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...offorEach 等方法遍历其键值对。例如:

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

4. API 差异

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

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

上一篇: 什么是 WeakMap?
下一篇: 什么是 Proxy?
纠错
反馈