object.prototype.tostring 是判断内置对象类型最可靠的方法,因其通过读取 [[class]] 或 symbol.tostringtag 返回标准字符串标识,能准确区分 map、set、date 等 typeof 返回 "object" 且 instanceof 跨 iframe 失效的类型。

JavaScript 中,Object.prototype.toString 是判断内置对象类型最可靠的方法之一,尤其对 Map、Set、Date 等特殊内置对象,比 typeof 或 instanceof 更准确、更安全。
为什么 toString 比 typeof 更适合判断 Map/Set/Date
typeof 对多数内置对象都返回 "object"(包括 Map、Set、Date、Array、null),无法区分;而 instanceof 在跨 iframe 或不同执行上下文时可能失效。而 Object.prototype.toString.call() 会读取对象内部的 [[Class]](ES5)或 Symbol.toStringTag(ES6+)属性,返回标准字符串标识,稳定且规范。
标准用法:统一调用 Object.prototype.toString
推荐始终使用以下模式,避免直接调用对象自身的 toString(可能被重写):
-
Object.prototype.toString.call(new Map())→"[object Map]" -
Object.prototype.toString.call(new Set())→"[object Set]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]"
封装一个可靠的类型检测函数
可提取公共逻辑,便于复用:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
function getType(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
// 使用示例:
getType(new Map()); // "Map"
getType(new Set()); // "Set"
getType(new Date()); // "Date"
getType({}); // "Object"
getType(/abc/); // "RegExp"
注意:slice(8, -1) 去掉 "[object " 和 "]",只保留核心类型名。该方式兼容所有主流环境,包括旧版 IE(IE9+ 完全支持)。
补充说明:Symbol.toStringTag 的影响
ES6 允许自定义对象的 toString 输出,通过设置 Symbol.toStringTag 属性:
const myObj = { [Symbol.toStringTag]: 'MyCustom' };
Object.prototype.toString.call(myObj); // "[object MyCustom]"
但 Map、Set、Date 等原生构造器已内置对应标签,无需手动设置,直接调用即可准确识别。










