最可靠的方式是使用 Object.prototype.toString.call(),因其能准确区分不同全局环境下的 WeakMap,如 Object.prototype.toString.call(new WeakMap()) === "[object WeakMap]" 返回 true,且在多 iframe 或 Web Worker 中依然有效。

JavaScript 中不能用 typeof 判断 WeakMap,因为它返回 "object";也不能直接用 instanceof WeakMap(在跨 iframe 场景下可能失效)。最可靠的方式是使用 Object.prototype.toString.call()。
用 Object.prototype.toString.call() 判断
这是判断内置对象类型的通用安全方法,能准确区分不同全局环境下的 WeakMap:
-
Object.prototype.toString.call(new WeakMap()) === "[object WeakMap]"返回 true - 对普通对象、Map、数组等都会返回对应字符串,不会误判
- 在多 iframe 或不同 Realm(如 Web Worker)中依然有效
封装成可复用的工具函数
可以写一个简洁的类型检查函数:
function isWeakMap(value) {
return Object.prototype.toString.call(value) === '[object WeakMap]';
}
// 使用示例
console.log(isWeakMap(new WeakMap())); // true
console.log(isWeakMap(new Map())); // false
console.log(isWeakMap({})); // false
console.log(isWeakMap(null)); // false
为什么不推荐 instanceof?
instanceof 依赖构造函数的原型链,在以下情况会出错:
立即学习“Java免费学习笔记(深入)”;
- 值来自另一个 iframe 或 window(WeakMap 构造函数不是同一个引用)
- 某些打包或沙箱环境(如微前端)隔离了全局对象
- 服务端渲染(SSR)中 globalThis.WeakMap 可能未定义或被 polyfill 替换
注意:WeakMap 无法遍历和检测内容
WeakMap 的键必须是对象,且不可枚举。即使确认是 WeakMap 实例,也无法获取它的大小、键或值:
- 没有
.size属性 - 没有
.keys()、.values()、.entries()方法 - 不能用
for...of遍历


















