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" | |
数字(含 NaN、Infinity) | "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)