Set vs WeakSet
Set 和 WeakSet 的设计目标、引用语义、遍历能力与使用场景对比。
#type / synthesis
#status / growing
#resource / javascript
#resource / ecmascript
[!info] related notes
- 所属 MOC: ES6 新特性 MOC, ECMAScript MOC
- 前置概念: Set, WeakSet, ECMAScript集合引用类型
- 相关场景: Vue3 Proxy 响应式原理, 手写 Vue reactive 和 watchEffect 的最小实现
Set vs WeakSet
一句话结论
- Set:通用唯一值集合,能遍历,适合去重和集合运算
- WeakSet:对象弱引用集合,不能遍历,适合临时标记对象
对比表
| 维度 | Set | WeakSet |
|---|---|---|
| 成员类型 | 任意值 | 只能对象 |
| 是否唯一 | 是 | 是 |
| 是否可遍历 | 可以 | 不可以 |
是否有 size | 有 | 没有 |
| 引用语义 | 强引用 | 弱引用 |
| 典型用途 | 去重、集合运算 | 临时标记、对象访问控制 |
什么时候用 Set
- 去重
- 判断成员是否存在
- 做并集、交集、差集
- 需要遍历集合内容
什么时候用 WeakSet
- 只想标记对象是否处理过
- 不想因为集合引用导致对象无法回收
- 不需要遍历所有成员
最短记忆方式
- Set = 唯一值集合
- WeakSet = 对象临时标记集合