检测 weakmap 和 weakset 应使用 object.prototype.tostring.call() 或 arkts 的 typeutil 工具方法,因 typeof 返回 "object"、instanceof 跨上下文失效;推荐写法:object.prototype.tostring.call(obj) === "[object weakmap]" 或 typeutil.isweakmap(obj)。

检测 WeakMap 和 WeakSet 类型,不能依赖 typeof(两者都返回 "object"),也不能用 instanceof 在跨 iframe 或不同执行上下文时可靠工作。最稳妥的方式是使用 构造函数名比对 或 专用类型判断工具方法(如 HarmonyOS ArkTS 的 TypeUtil.isWeakMap / TypeUtil.isWeakSet)。
WeakMap 检测的可靠写法
核心逻辑:检查对象是否为 WeakMap 实例,且其构造函数是全局 WeakMap。
- 基础判断(推荐用于多数场景):
obj !== null && typeof obj === 'object' && obj.constructor === WeakMap - 更健壮的写法(防篡改):
Object.prototype.toString.call(obj) === '[object WeakMap]' - 若使用 ArkTS TypeUtil 工具类:
TypeUtil.isWeakMap(obj)—— 内部已封装兼容性处理,返回布尔值
WeakSet 检测的可靠写法
原理同 WeakMap,关键在于避免误判普通对象或 Set。
- 直接构造器比对:
obj !== null && typeof obj === 'object' && obj.constructor === WeakSet - 标准 toString 判断(兼容性最好):
Object.prototype.toString.call(obj) === '[object WeakSet]' - ArkTS 中调用:
TypeUtil.isWeakSet(obj)—— 支持运行时环境隔离判断
为什么不用 instanceof?
WeakMap/WeakSet 对象在跨 iframe、Web Worker 或某些模块沙箱中创建时,其构造函数与当前上下文的 WeakMap/WeakSet 并非同一个引用,instanceof 会返回 false,造成误判。而 toString.call() 是 ECMAScript 规范定义的内部标签检测方式,不受执行上下文影响。
实际检测示例
你可以这样快速验证:
-
Object.prototype.toString.call(new WeakMap())→"[object WeakMap]" -
Object.prototype.toString.call(new WeakSet())→"[object WeakSet]" -
Object.prototype.toString.call(new Map())→"[object Map]"(注意区分) -
Object.prototype.toString.call({})→"[object Object]"











