typeof 是 JavaScript 中返回小写字符串类型的一元操作符,但存在 null 返回"object"等陷阱,无法区分数组、日期等引用类型,应配合 Array.isArray() 等方法精准判断。

typeof 是 JavaScript 中用于检测变量或表达式数据类型的**一元操作符**,返回一个表示类型的小写字符串。它在运行时工作,但有若干特殊行为和常见陷阱,需特别注意。
基础类型检测结果(符合直觉)
对原始类型(primitive types),typeof 表现稳定:
-
typeof undefined→"undefined" -
typeof null→"object"(历史遗留 bug,不是设计意图) -
typeof true/typeof false→"boolean" -
typeof 42/typeof 3.14/typeof NaN→"number" -
typeof "hello"→"string" -
typeof Symbol("id")→"symbol" -
typeof BigInt(100n)→"bigint"
函数与对象的区分
函数在 JS 中是“可调用对象”,typeof 单独将其识别为一类:
-
typeof function() {}→"function" -
typeof class C {}→"function"(类本质是函数) -
typeof {}/typeof []/typeof new Date()/typeof /regex/→ 全部返回"object"
这意味着 typeof 无法区分普通对象、数组、日期、正则等引用类型,仅能确认它们属于“object”大类。
立即学习“Java免费学习笔记(深入)”;
ES6 新增:箭头函数与 Promise
箭头函数没有自己的 this 和 prototype,但仍被归为函数:
-
typeof (() => {})→"function" -
typeof Promise.resolve()→"object"(Promise 实例是普通对象) -
typeof Promise→"function"(Promise 构造器本身是函数)
null 和 typeof 的经典误区
typeof null === "object" 是 JavaScript 最广为人知的缺陷之一。原因是在早期 JS 实现中,值的低阶位用 3 位标识类型,而 null 的内部表示全为 0,被误判为“空对象引用”。尽管 ECMAScript 规范已将其定为历史事实,**不建议依赖此结果做类型判断**。
若需准确识别 null,应显式使用 value === null;若要区分数组、日期等,应改用 Array.isArray()、Object.prototype.toString.call(value) 等更精确的方法。










