JavaScript 中 如何 使用 typeof 运算符 检测 七种 原始 类型

作者:袖梨 2026-07-09
JavaScript仅有六种原始类型(string、number、boolean、undefined、symbol、bigint),typeof能准确识别它们,但对null返回"object"是历史bug;函数返回"function",其他对象统一返回"object",需结合=== null、Array.isArray()或Object.prototype.toString.call()进行精确判断。

JavaScript 中 typeof 运算符能准确识别六种原始类型(primitive types),但对 null 的检测结果是 "object",这是历史遗留 bug,并非第七种原始类型——JavaScript 实际只有六种原始类型:string、number、boolean、undefined、symbol、bigint(ES2020 新增),而 null 是独立的特殊值,不属于原始类型,也不属于对象。

typeof 能正确识别的六种原始类型

typeof 对以下六类值返回对应字符串,行为一致且可靠:

  • string:如 typeof "hello""string"
  • number:如 typeof 42"number"(包括 NaNInfinity
  • 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,必须额外判断:

立即学习“Java免费学习笔记(深入)”;

  • 不要依赖 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 等)用 instanceoftoString 方法
  • 需要完整类型名时,用 Object.prototype.toString.call(x).slice(8, -1)(如 [object Array]"Array"

相关文章

精彩推荐