object.prototype.tostring.call 是最可靠通用的类型判断方式,基于内部[[class]]属性返回"[object type]"格式字符串,可精准识别内置对象、原始类型包装对象及跨iframe对象类型。

Object.prototype.toString.call 是 JS 中最可靠、最通用的类型判断方式,它能绕过 instanceof 的原型链依赖和 typeof 的局限性,精准识别内置对象、原始类型包装对象、甚至跨 iframe 的对象类型。
为什么不用 typeof 或 instanceof?
typeof 对对象类型一律返回 "object"(null 除外),无法区分 Array、Date、RegExp 等;instanceof 依赖构造函数的 prototype 链,在多 iframe 环境下会失效(不同上下文的 Array 构造函数不相等)。而 Object.prototype.toString.call 基于内部 [[Class]] 属性(ES5 规范),每个内置对象都有唯一标识字符串,稳定且跨环境。
基本用法和标准返回格式
调用后返回形如 "[object Type]" 的字符串,Type 是首字母大写的类型名:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]" -
Object.prototype.toString.call(123)→"[object Number]" -
Object.prototype.toString.call(new Boolean(true))→"[object Boolean]"
封装成可复用的类型判断函数
提取返回字符串中的类型名,转为小写便于比较:
function typeOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}
// 使用示例
typeOf([]); // "array"
typeOf(/abc/); // "regexp"
typeOf(new Set()); // "set"
typeOf(globalThis); // "global"
注意:ES6+ 新增的 Symbol、Map、Set、Promise、BigInt 等也支持,返回对应类型名(如 "[object Map]"),无需额外 polyfill。
注意事项和边界情况
该方法对自定义类实例默认返回 "[object Object]",除非显式设置 Symbol.toStringTag:
- 普通 class 实例:返回
"[object Object]" - 带
static get [Symbol.toStringTag]() { return 'MyClass'; }的类:返回"[object MyClass]" - 不能检测用户自定义的“伪类型”(如通过 Object.create(null) 创建的对象仍返回 "[object Object]")
- 在极老浏览器(IE8 及以下)中,部分对象(如 null/undefined)可能不规范,但现代项目通常无需兼容










