WeakMap 和 WeakSet 均不可迭代,因其缺乏 keys()、values()、entries() 方法及 Symbol.iterator 接口,且遍历会违背弱引用不阻止 GC 的设计初衷。

WeakMap 和 WeakSet 都不可迭代,这是它们与 Map 和 Set 最直观的区别之一。
WeakMap 无法遍历
WeakMap 没有 keys()、values()、entries() 方法,也不支持 for...of 循环或 forEach()。尝试调用这些方法会报错或返回 undefined。
- 不能用
for (const [key, val] of weakMap)—— 语法错误 - 没有
weakMap.keys()—— 方法不存在 -
weakMap[Symbol.iterator]是undefined
WeakSet 同样不支持遍历
WeakSet 只提供 add()、has()、delete() 三个方法,没有 size 属性,也没有任何迭代接口。
- 不能用
for (const item of weakSet) - 没有
weakSet.values()或weakSet.entries() -
Array.from(weakSet)会抛出 TypeError
为什么设计成不可迭代?
根本原因在于弱引用语义与遍历行为存在逻辑冲突:
- 遍历时需“持有”当前项的引用,否则可能在迭代中途被 GC 回收,导致行为不可预测
- 若允许遍历,就相当于对键/值产生了强引用,违背了“不阻止回收”的设计初衷
- 不可迭代是语言层面对弱引用约束的强制保障,不是遗漏功能
如何确认一个集合是否可迭代?
可以检查其是否具有 Symbol.iterator 方法:
-
Map.prototype[Symbol.iterator]存在 → 可迭代 -
WeakMap.prototype[Symbol.iterator]是undefined→ 不可迭代 - 同理适用于
Set和WeakSet

















