JavaScript 中无准确判断类型的银弹:typeof 对 null、数组、日期等均返回"object";Object.prototype.toString.call() 是最通用方案,可精确识别内置类型;Array.isArray() 是判断数组的唯一推荐方式;instanceof 仅适用于同全局环境。

JavaScript 中没有“准确判断类型”的银弹,typeof 会把 null 判为 "object",Array、Date、RegExp 全部被 typeof 归为 "object",而 instanceof 在跨 iframe 场景下直接失效。
为什么 typeof 不可靠?
typeof 只能区分原始类型("string"、"number"、"boolean"、"undefined"、"symbol"、"bigint")和函数,其余一概返回 "object" —— 包括 null、数组、正则、日期、Map、Set 等。
-
typeof null→"object"(历史 bug,ECMAScript 规范已明确保留) -
typeof []→"object"(不是"array") -
typeof new Date()→"object"(不是"date") -
typeof /abc/→"object"(不是"regexp")
用 Object.prototype.toString.call() 获取精确标签
这是目前最通用、跨环境兼容的类型识别方式,它读取对象内部的 [[Class]] 标签(ES5 起规范为 [[Symbol.toStringTag]])。
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]" -
Object.prototype.toString.call(new Map())→"[object Map]" -
Object.prototype.toString.call(123n)→"[object BigInt]"
可封装成工具函数:
立即学习“Java免费学习笔记(深入)”;
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
function typeOf(val) {
return Object.prototype.toString.call(val).slice(8, -1).toLowerCase();
}
// typeOf([]) → "array"
// typeOf(/a/) → "regexp"
Array.isArray() 和 instanceof 的适用边界
它们不是万能替代,但各自有明确适用场景:
-
Array.isArray()是判断数组的**唯一推荐方式**,比toString更快,且语义清晰 -
instanceof仅适用于**同一全局环境下的构造器判断**,比如obj instanceof Promise;跨 iframe 时,iframe.contentWindow.Array !== Array,会导致误判 -
obj.constructor === Array不安全 —— 构造器可被改写,且constructor属性可枚举、可覆盖
注意 Symbol 和 BigInt 的特殊性
这两个类型在旧版 Node.js 或浏览器中支持不一,且 typeof 虽然能正确返回 "symbol" 和 "bigint",但部分 polyfill 或调试工具可能无法识别其值。更关键的是:Object.prototype.toString.call() 在较老环境(如 IE11)中对 Symbol 返回 "[object Symbol]",但对 BigInt 会报错(TypeError: Cannot convert a BigInt value to a number),所以实际使用前需做存在性检查。
真正难处理的从来不是“怎么写判断”,而是“要不要为边缘环境妥协”——比如是否需要兼容 IE11、是否允许 typeof + 特征检测组合使用、是否接受引入 lodash.isPlainObject 这类辅助。这些决策点,往往比类型判断本身更影响代码健壮性。










