object.prototype.tostring.call()是最可靠、兼容性最好的类型检测方式,因其基于内部[[class]]标识,能准确区分原始类型、内置对象及跨iframe对象,而typeof和instanceof存在返回不精确或环境限制问题。

直接用 Object.prototype.toString.call() 是 JavaScript 中最可靠、兼容性最好的类型检测方式,它能准确区分原始类型、内置对象、甚至跨 iframe 的数组或日期等。
为什么不用 typeof 或 instanceof?
typeof 对 null 返回 "object",对数组、正则、日期都返回 "object",完全无法区分;instanceof 在多全局环境(比如 iframe)下会失效,因为构造函数不共享。而 Object.prototype.toString.call() 基于内部 [[Class]] 标识,不受这些限制。
基本写法和返回格式
调用形式固定:Object.prototype.toString.call(value)
返回形如 "[object Type]" 的字符串,其中 Type 是标准类型名(首字母大写,无空格)。
-
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(/abc/)→"[object RegExp]"
封装成通用类型判断函数
提取返回值中的类型名,转为小写更便于使用:
function getType(value) {
const str = Object.prototype.toString.call(value);
return str.slice(8, -1).toLowerCase(); // 去掉 "[object " 和 "]"
}
这样就能得到 "array"、"date"、"promise" 等简洁字符串,方便条件判断。
- 支持所有 ES5+ 内置类型:包括
Map、Set、WeakMap、BigInt、Symbol、AsyncFunction等 - 对自定义类实例,默认返回
"object",除非显式定义Symbol.toStringTag - 在旧版 IE 中也完全可用,无兼容性问题
实际应用建议
日常开发中不必每次都手写完整调用,可借助工具函数或现代库(如 Lodash 的 _.toString()),但理解底层原理很重要。
- 避免用
value.constructor.name判断类型——容易被篡改,且 null/undefined 会报错 - 检测数组优先用
Array.isArray()(语义清晰、性能略优),但需要兼容老环境时仍推荐 toString 方案 - 注意:该方法检测的是“当前值的运行时类型”,不是变量声明类型或 TypeScript 类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











