先说结论:JavaScript 中 typeof 运算符能准确识别六种原始类型,但对 null 返回 "object" 是历史遗留的 bug,并非什么第七种原始类型。JavaScript 实际只拥有六种原始类型:string、number、boolean、undefined、symbol、bigint(ES2020 新增)。null 是独立的特殊值,既不属于原始类型,也不属于对象。

下面我们从最基础的用法开始拆解,进一步理解 typeof 运算符类型检测 的具体机制。
typeof 能正确识别的六种原始类型
typeof 对以下六类值返回对应字符串,行为一致且可靠,是 JavaScript 类型判断 的基础工具:
- string:如
typeof "hello"→"string" - number:如
typeof 42→"number"(包括NaN和Infinity) - boolean:如
typeof true→"boolean" - undefined:如
typeof undefined→"undefined";未声明变量用typeof不报错,也返回"undefined" - symbol:如
typeof Symbol("id")→"symbol" - bigint:如
typeof 123n→"bigint"(注意末尾n字面量)
typeof null 返回 "object" 是个陷阱
typeof null 返回 "object",这既不符合直觉,也容易引发误判,是许多开发者在使用 typeof 检测 null 时踩过的坑。它源于 JavaScript 最初实现时的二进制标识 bug,现在已经成了事实标准,无法更改。
如果需要在逻辑中区分 null,必须额外添加一层判断:
- 千万不要依赖
typeof x === "object"来断定某个值是对象——null也会命中这个条件,这正是 typeof null 返回 object 带来的隐患。 - 安全检测
null应该写为:x === null(使用严格相等),这是 JavaScript 判断 null 最可靠的方式。 - 若要统一判断“是否为纯对象(非 null、非原始值)”,可以用:
typeof x === "object" && x !== null,从而绕过 typeof 运算符的 null 陷阱。
function 和 object 的区分要点
typeof 对函数返回 "function",这属于 ECMAScript 规范的特例(虽然函数本质上是对象),也是 typeof 判断函数类型 的常用场景:
typeof function(){}→"function"typeof new Date()→"object"typeof []、typeof {}、typeof /regex/均返回"object"- 所以
typeof无法区分数组、正则、普通对象等,必须配合Array.isArray()或Object.prototype.toString.call()来做细分判断,这也是 JavaScript 类型检测方法 中常用的补充手段。
实际类型检测建议
单靠 typeof 是不够的,推荐以下组合策略来实现 精准的类型判断:
- 原始类型优先用
typeof(除null外都准确),这是 typeof 运算符最佳实践 的核心原则。 null单独用=== null判断,避免 typeof null 的 bug 影响逻辑。- 对象子类型(Array、Date、RegExp 等)用
instanceof或toString方法,以弥补 typeof 识别对象类型 的局限。 - 需要完整类型名时,用
Object.prototype.toString.call(x).slice(8, -1)(如[object Array]→"Array"),这是 JavaScript 获取准确类型 的通用方案。
一句话总结:typeof 是快速识别六种原始类型的利器,但要避开 null 这个历史大坑,再结合其他方法才能完成 JavaScript 类型检测 的精准判断。
