typeof 运算符

typeof 用于判断值的语言基础类型,对原始类型好用但不能细分对象,且 typeof null 是历史 bug。

#type / concept #status / evergreen #resource / javascript #resource / ecmascript

[!info] related notes

typeof 运算符

一句话定义

typeof 返回值的语言级基础类型字符串,适合快速分流原始类型,但不能细分对象。

返回值映射

操作数返回值备注
undefined"undefined"
null"object"历史 Bug
true / false"boolean"
数字(含 NaNInfinity"number"NaN 也是 number
字符串"string"
Symbol()"symbol"ES6
BigInt"bigint"ES2020
函数(含 class、箭头函数)"function"[[Call]] 内部槽
其他对象(含数组、Date)"object"不能细分
document.all"undefined"HTML 规范故意设计

设计目标

typeof 不是要精确区分所有对象种类,而是提供一个低成本、运行时快速、适合基础分流的类型分类器。

它回答的问题是:“这个值属于哪一大类?“

typeof null === "object" 的历史

JavaScript 最初版本中,值用 32 位存储,引擎用低位标签区分类型:

  • 000:对象
  • 1:整数
  • 010:浮点数
  • 100:字符串
  • 110:布尔值

null 的机器表示是全 0(0x00),低三位恰好是 000,被误判为对象。后来因兼容性无法修复。

typeof 返回 "function" 的原因

函数本质是对象,但它有特殊的 [[Call]] 内部能力(可调用)。typeof 对可调用对象单独返回 "function",掺入了一点行为能力判断。

typeof 唯一不会报错的未定义变量检查

typeof notDefined    // "undefined"(不报错)
notDefined           // ReferenceError

这是 typeof 相比直接比较 x === undefined 的一个独特优势。

document.all:唯一的例外

typeof document.all          // "undefined"
document.all !== undefined   // true

HTML 规范故意让 typeof document.all === "undefined",为了兼容 90 年代旧代码。这是 JS 中唯一一个 typeof x === "undefined"x !== undefined 的值。

适用场景

typeof x === 'string'
typeof x === 'number' && !Number.isNaN(x)
typeof x === 'boolean'
typeof x === 'function'
typeof x === 'undefined'

不适用场景

  • 判断 null(用 x === null
  • 判断数组(用 Array.isArray(x)
  • 区分 Date、RegExp 等内建对象(用 Object.prototype.toString.call
创建于 2026/4/1 更新于 2026/5/27