Object.prototype.toString 是最可靠的类型检测方式,它通过读取内部属性 [[Class]] 或 Symbol.toStringTag 返回标准格式字符串(如 "[object Array]"),不受原型链污染或构造函数改写影响,且兼容 iframe 和 ES6+ 新增类型。

JavaScript 中 Object.prototype.toString 是最可靠、原生支持的类型检测方式,它能准确区分内置对象类型(如 Array、Date、RegExp 等),不受原型链污染或构造函数被改写的影响。
为什么 toString() 比 typeof 和 constructor 更准
typeof 对数组、正则、日期等都返回 "object",无法细分;constructor 属性易被覆盖或跨 iframe 失效;而 Object.prototype.toString.call(value) 会读取内部属性 [[Class]](ES5)或 Symbol.toStringTag(ES6+),返回标准格式字符串,比如 "[object Array]"。
标准调用写法和返回格式
必须通过 call 或 apply 绑定目标值,否则直接调用 toString() 会走实例自己的方法(如数组的 join 式输出):
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(/abc/)→"[object RegExp]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]"
封装成可复用的类型判断函数
提取返回字符串中的类型名,转为小写便于比较:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
function typeOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}
// typeOf([]) === 'array'
// typeOf(new Map()) === 'map'
// typeOf(new Set()) === 'set'
注意:ES6+ 新增的类型(如 Map、Set、Promise、BigInt)也支持,前提是运行环境已实现对应规范。
注意事项和边界情况
该方法对自定义类默认返回 "[object Object]",除非显式设置 Symbol.toStringTag:
-
class MyClass {}→"[object Object]" -
MyClass[Symbol.toStringTag] = 'MyClass';→"[object MyClass]" - 在 iframe 中创建的对象,
instanceof会失效,但toString依然准确 - 不要简写为
{}.toString.call(x),因为空对象可能被重写过toString
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










