JavaScript中 typeof运算符检测七种原始类型
作者:技术拾光时间:2026-07-26 08:24:40浏览:380
typeof操作符可准确识别字符串、数字、布尔、未定义、符号、大整数六种原始类型。但typeofnull返回"object"是历史缺陷,应使用严格相等判断。此外,typeof对数组、正则等对象子类型均返回"object",无法区分,需借助instanceof或Object.prototype.toString等方法进行精确类型检测。
总结来看:JavaScript 中 typeof 运算符能够准确识别六种原始类型,但 null 返回 "object" 是历史遗留的 bug,并非第七种原始类型。JavaScript 实际只拥有六种原始类型:string、number、boolean、undefined、symbol、bigint(ES2020 新增)。null 是独立的特殊值,既不属于原始类型,也不属于对象。

我们从最基础的用法开始拆解。
typeof 能正确识别的六种原始类型
typeof 对以下六类值返回对应字符串,行为一致且可靠:
- 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",这既不符合直觉,也容易引发误判。它源于 JavaScript 最初实现时的二进制标识 bug,现在已经成了事实标准,无法更改。
如果需要在逻辑中区分 null,必须额外添加一层判断:
- 千万不要依赖
typeof x === "object"来断定某个值是对象——null也会命中这个条件。 - 安全检测
null应该写为:x === null(使用严格相等)。 - 若要统一判断“是否为纯对象(非 null、非原始值)”,可以用:
typeof x === "object" && x !== null。
function 和 object 的区分要点
typeof 对函数返回 "function",这属于 ECMAScript 规范的特例(虽然函数本质上是对象):
typeof function(){}→"function"typeof new Date()→"object"typeof []、typeof {}、typeof /regex/均返回"object"- 所以
typeof无法区分数组、正则、普通对象等,必须配合Array.isArray()或Object.prototype.toString.call()来做细分判断。
实际类型检测建议
单靠 typeof 是不够的。推荐组合策略:
- 原始类型优先用
typeof(除null外都准确)。 null单独用=== null判断。- 对象子类型(Array、Date、RegExp 等)用
instanceof或toString方法。 - 需要完整类型名时,用
Object.prototype.toString.call(x).slice(8, -1)(如[object Array]→"Array")。
一句话总结:typeof 是快速识别六种原始类型的利器,但要避开 null 这个历史大坑,再结合其他方法才能完成精准的类型判断。
