object.prototype.tostring.call()是最可靠的类型检测方式,它绕过原型链直接读取内部[[class]]属性,返回如"[object array]"的字符串,精准识别null、数组、正则、symbol、bigint等所有类型。

直接用 typeof 判断类型在 JavaScript 中容易出错(比如数组、null、日期都返回 "object"),而 Object.prototype.toString.call() 是最可靠的基础类型检测方式,它能返回带 “[object …]” 格式的内部标签。
为什么 Object.prototype.toString 更准确
每个内置对象(Array、Date、RegExp、Map 等)都有自己的 @@toStringTag 属性,Object.prototype.toString 会读取这个标签并格式化为字符串。原生类型不会被原型链上的重写影响,所以结果稳定可预期。
-
typeof []→"object",但Object.prototype.toString.call([])→"[object Array]" -
typeof null→"object"(历史 bug),但Object.prototype.toString.call(null)→"[object Null]" -
typeof new Date()→"object",但Object.prototype.toString.call(new Date())→"[object Date]"
标准用法:call + toString
必须用 .call() 或 .apply() 绑定目标值,不能直接调用 toString()(否则 this 指向全局或 undefined,结果不可靠)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- ✅ 正确:
Object.prototype.toString.call(value) - ❌ 错误:
value.toString()(可能被重写)或Object.prototype.toString(value)(this 未绑定) - ✅ 可封装成工具函数:
const typeOf = v => Object.prototype.toString.call(v).slice(8, -1);(如返回"Array")
常见类型识别示例
返回字符串统一为 "[object Xxx]" 格式,提取中间部分即可判断:
-
Object.prototype.toString.call(123)→"[object Number]" -
Object.prototype.toString.call("abc")→"[object String]" -
Object.prototype.toString.call(Promise.resolve())→"[object Promise]" -
Object.prototype.toString.call(new Set())→"[object Set]" -
Object.prototype.toString.call(window)→"[object Window]"(浏览器环境)
注意边界情况
自定义对象默认返回 "[object Object]",除非显式设置 Symbol.toStringTag;ES6+ 新增类型(如 BigInt、AsyncFunction)也支持,但低版本环境需注意兼容性。
- 自定义类可加
static get [Symbol.toStringTag]() { return 'MyClass'; } -
Object.prototype.toString.call(10n)→"[object BigInt]"(Node.js ≥ 10.4 / Chrome ≥ 67) - IE8 及更早不支持
Symbol,但基础类型(Array/Date/RegExp 等)仍可用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










