← [ BACK_TO_NOTES ]

typeof 运算符

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

#concept #evergreen #javascript #ecmascript

[!info] related notes

typeof 运算符

一句话定义

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

返回值映射

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

设计目标

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

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

typeof null === "object" 的历史

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

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

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

typeof 返回 "function" 的原因

函数本质是对象,但它有特殊的 [[function-type-call|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/7/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本