最可靠的方式是 object.prototype.tostring.call()。判断 map 或 set 应用该方法,因其基于内部[[class]]标签,不受跨 iframe 或 realm 影响;而 instanceof 在跨上下文时失效,constructor 则依赖未被篡改且同执行环境。

直接用 Object.prototype.toString.call() 是最可靠的方式。
判断是否为 Map
Map 是内置构造函数生成的特殊对象,不能靠 typeof(返回 "object")或 instanceof Map(在跨 iframe 场景下可能失效)准确识别。推荐写法:
Object.prototype.toString.call(myVar) === '[object Map]'- 或者更简洁地:
myVar.constructor === Map(前提是你没改写过constructor,且处于同一执行上下文)
判断是否为 Set
同理,Set 也需避免误判普通对象或数组:
Object.prototype.toString.call(myVar) === '[object Set]'-
myVar.constructor === Set(适用多数常规场景)
为什么不用 instanceof?
当 Map/Set 实例来自其他 iframe 或不同 Realm(如通过 new window.Map() 创建),instanceof 会返回 false,因为不同上下文中的 Map 构造函数不相等。而 toString.call() 基于内部 [[Class]] 标签,不受 Realm 影响,兼容性更好。
小技巧:封装成工具函数
可以这样快速复用:
function isMap(val) { return Object.prototype.toString.call(val) === '[object Map]'; }function isSet(val) { return Object.prototype.toString.call(val) === '[object Set]'; }











