object.prototype.tostring是最可靠的类型检测方式,因其读取内置对象的[symbol.tostringtag]属性生成唯一字符串标签,能准确区分所有内置类型包括null和undefined。

JavaScript 中,Object.prototype.toString 是最可靠、最通用的类型检测方式,它能准确区分所有内置基本类型和引用类型,包括 null 和 undefined(而 typeof 在这两者上表现不一致)。
为什么 toString() 能准确识别类型?
每个内置对象(如 Array、Date、RegExp 等)内部都定义了自己的 [Symbol.toStringTag] 属性(ES6 引入),而 Object.prototype.toString 方法会读取该属性来生成标准字符串标签。即使原生对象被修改了 toString 方法,只要没覆盖 Object.prototype.toString 本身,就能通过 call 或 apply 借用它来获取真实类型。
标准写法:借用 Object.prototype.toString
直接调用 {}.toString() 不行——它等价于 Object.prototype.toString(),但会把 this 绑定为一个空对象,失去目标值的上下文。正确做法是用 call 显式传入待检测值:
-
Object.prototype.toString.call(123)→"[object Number]" -
Object.prototype.toString.call("abc")→"[object String]" -
Object.prototype.toString.call(true)→"[object Boolean]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]" -
Object.prototype.toString.call([1,2,3])→"[object Array]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(/abc/)→"[object RegExp]" -
Object.prototype.toString.call(function(){})→"[object Function]" -
Object.prototype.toString.call(new Set())→"[object Set]" -
Object.prototype.toString.call(BigInt(123))→"[object BigInt]" -
Object.prototype.toString.call(Symbol("a"))→"[object Symbol]"
封装成工具函数更实用
可提取类型名,避免每次写完整字符串匹配:
const typeOf = (val) => {
return Object.prototype.toString.call(val).slice(8, -1);
};
// 使用示例:
typeOf(42); // "Number"
typeOf([]); // "Array"
typeOf(null); // "Null"
typeOf(undefined); // "Undefined"
typeOf(new Map()); // "Map"
注意:slice(8, -1) 是为了去掉 "[object " 和 "]",得到纯类型名。也可用正则 /\[object (\w+)\]/.exec(...)[1],但 slice 更轻量。
和 typeof 的关键区别
typeof 对大部分对象都返回 "object"(包括数组、日期、正则、null),无法细分;而 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]"
因此,在需要精确判断数组、日期、正则、Map/Set 等类型时,必须用 Object.prototype.toString。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











