weakmap 的核心优势是弱引用键对象,不阻止 gc 回收,避免内存泄漏;仅接受对象作键,无 size 和迭代方法,天然适配私有状态缓存。

WeakMap 的核心内存回收优势在于:它对键对象采用弱引用,不阻止垃圾回收器(GC)清理那些仅被 WeakMap 引用的对象;而 Map 持有强引用,会人为延长对象生命周期,容易导致内存泄漏。
WeakMap 不阻碍 GC:对象无其他引用时自动释放
当一个对象仅作为 WeakMap 的键存在,且外部已不再持有对该对象的任何引用时,GC 可以正常将其标记为不可达并回收。WeakMap 中对应的键值对也会随之消失——开发者无需手动 delete,也不必担心残留条目。
- 例如监听 DOM 节点后存储临时状态:
weakMap.set(node, { clicked: true });节点被移除、页面卸载或 node 变量被赋值为null后,只要没其他地方引用该 node,它就能被立即回收 - Map 则不同:
map.set(node, data)会让 node 始终“活”着,即使页面早已销毁该节点,只要 map 实例还存在,node 就不会被 GC
没有 size 属性和迭代能力,本质是“不可观测”的缓存容器
WeakMap 不暴露 size、不支持 keys()/values()/entries(),也不能用 for...of 遍历。这不是功能缺失,而是设计使然:它从语言层面杜绝了“因遍历需求而长期持有所有键引用”的可能,避免间接造成内存滞留。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 无法遍历意味着你不能写出“检查所有缓存项是否过期”的逻辑——这反而强制你接受“键存在与否由 GC 决定”的事实
- 这种不可控性恰是安全性的来源:它天然契合“附属元数据”场景,比如给某个对象打私有标签,而不影响其生命周期
只接受对象作键,排除原始值干扰
WeakMap 键必须是对象(包括函数、数组、DOM 节点等),不能是字符串、数字、Symbol 或 null。这个限制看似苛刻,实则精准服务于弱引用机制:
- 原始值本身存储在栈或常量池,不参与堆上的 GC 管理,谈不上“弱引用”意义
- 只有堆中对象才需要被 GC 追踪,WeakMap 专为这类对象设计,确保每个键都处于 GC 可识别的引用图中
- 这也防止误将临时字符串当作键反复创建新条目,从源头减少无效内存占用
适合封装私有状态,不污染对象自身
WeakMap 常用于模拟“私有属性”:把实例对象作为键,把闭包中的状态作为值。由于键是弱引用,实例销毁时状态自动解绑,不需要在 destroy 或 unmount 时额外清理。
- Vue 3 的响应式系统就用 WeakMap 缓存 reactive 对象与依赖收集器(effect)的映射关系,确保组件卸载后相关副作用能自然释放
- 类库如 Lodash 的 memoize 有时也用 WeakMap 缓存基于对象参数的结果,避免缓存长期霸占内存










