typeof 只能准确识别原始类型和函数,对其他引用类型均返回 "object";null 是历史 bug 导致 typeof null 为 "object",需用 === 单独判断;数组用 Array.isArray,对象细分用 Object.prototype.toString.call。

JavaScript 数据类型分两类:原始类型(7 种)和引用类型(对象类)。typeof 是检测原始类型的快捷方式,但对多数引用类型只能返回 "object",不能准确区分数组、日期、正则等,函数是唯一例外,会返回 "function"。
能准确识别的原始类型
typeof 对以下类型返回结果稳定且可靠:
-
"number":包括整数、小数、
NaN、Infinity,例如typeof 42→"number" -
"string":任何字符串字面量或 String 实例,如
typeof "hi"→"string" -
"boolean":
true或false,typeof false→"boolean" -
"undefined":未声明变量或显式赋值为
undefined,typeof undeclaredVar→"undefined" -
"symbol":ES6 新增,
typeof Symbol('a')→"symbol" -
"bigint":ES2020 新增,
typeof 100n→"bigint"
null 是个特例,不是对象
typeof null 返回 "object",这是 JavaScript 诞生初期的历史 bug,一直保留至今。它不代表 null 是对象,只是底层实现把空指针误判为对象类型。实际使用中必须单独处理:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 判断是否为 null,应直接用
value === null - 若想排除 null 后再检查是否为对象,可组合写法:
value !== null && typeof value === "object"
引用类型里只有函数能被正确识别
所有非函数的引用类型(数组、对象、日期、正则、Promise、Map 等)都会返回 "object":
立即学习“Java免费学习笔记(深入)”;
-
typeof []→"object"(不能靠它判断数组) -
typeof new Date()→"object" -
typeof /abc/→"object" -
typeof class {}→"function"(class 本质是函数) -
typeof function(){}→"function"(唯一能精准识别的引用类型)
更可靠的替代方案
当 typeof 不够用时,应配合其他方法:
- 判断数组:用
Array.isArray(value) - 判断 null:直接用
value === null - 区分具体对象类型:用
Object.prototype.toString.call(value),例如:Object.prototype.toString.call([])→"[object Array]"Object.prototype.toString.call(new Date())→"[object Date]" - 检查构造来源:用
value instanceof Date,但注意跨 iframe 会失效

















