一 Map和WeakMap有什么不同?WeakMap的特点是什么?什么情况下使用WeakMap而不是Map?

Map和WeakMap是JavaScript中两种不同的键值对集合,它们的主要区别在于键的引用强度和内存管理方式:

1.1 Map的特点:

  1. 键可以是任何值:Map的键可以是对象、原始类型值(如字符串、数字、布尔值)、甚至是Symbol。
  2. 强引用:Map对键保持强引用,这意味着只要Map存在,它所引用的键对象就不会被垃圾回收器回收,即便没有其他地方引用这些键对象。
  3. 遍历和大小:Map提供了keys()values()entries()方法来遍历其内容,以及size属性来获取键值对的数量。

1.2 WeakMap的特点:

  1. 键必须是对象:WeakMap的键必须是对象(不包括原始类型值),且不能是全局对象或原生类型如window(在浏览器环境)。
  2. 弱引用:WeakMap对键持有弱引用,意味着如果一个对象仅被WeakMap引用,当没有其他强引用指向这个对象时,垃圾回收器可以回收该对象及其关联的值,即使它们还在WeakMap中。
  3. 不可遍历和无大小:WeakMap不提供遍历其键值对的方法,也没有size属性,因为其设计目的是为了不影响垃圾回收机制,因此外界无法确定WeakMap的实际大小或内容。

1.3 使用WeakMap而非Map的情况:

  1. 避免内存泄漏:当你需要关联数据到一个对象,但又不想阻止该对象在不再需要时被垃圾回收,就可以使用WeakMap。这对于临时存储与特定对象相关的元数据特别有用。
  2. 私有数据存储:WeakMap可以用来存储对象的私有数据,因为外部无法通过遍历访问这些数据,增加了数据的安全性。
  3. 解决循环引用问题:在某些场景下,特别是实现深度复制或者维护对象间的关系映射时,使用WeakMap可以避免因相互引用导致的内存泄漏问题。