Map和WeakMap都是ES6新增的集合类型。

image.png
image.png

共同点

都有类似的方法,WeakMap是Map的子集。
都有:

  • set
  • has
  • get
  • delete

Map的功能很强大,WeakMap主要是其的一种弱化版本。

Other:Map & Object

  • map中的各映射是有顺序的,object是没有
  • 传统的object对象只能用【字符串、Symbol】作key(键值),而map甚至可以用对象作key值。
  • 上面的第二点其实会造成很严重的问题,这意味着我们没法区分 1 和 ‘1’

image.png

不同点

一、WeakMap仅仅适用于key值为对象的Map,而Map是任意的

二、用Map可能会占用内存,JS没有回收对象,而WeakMap没有正式引用对象(不会阻止垃圾回收)

  1. let obj = {b: 1}
  2. let m = new Map([[obj, 1]])
  3. let w = new WeakMap([[obj, 3]])
  4. obj = null

上述语句中,
Map:只要键存在,键值对就会存在内存中,会阻止垃圾回收。
weakMap:对象值没有被正式引用,不会阻止垃圾回收。

垃圾回收机制: 1、标记清除:一开始全部标记。进入执行上下文的时候,去掉标记,退出上下文的时候,再加上。(最后去掉所有标记的)《消亡名单》 2、引用计数:给所有值计数,计算他们的引用值,引用值不为0则不清除(例如循环引用)

三、总结:

1、weak,描述的是JS垃圾回收机制中,对待“弱映射”中键的方式。——这也是它们之间不同的关键所在。

2、WeakMap 没有 clear 方法,因为没有必要。