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 "hello" → "string"
typeof 42 → "number"(包括 NaN 和 Infinity)typeof true → "boolean"
typeof undefined → "undefined";未声明变量用 typeof 不报错,也返回 "undefined"
typeof Symbol("id") → "symbol"
typeof 123n → "bigint"(注意末尾 n 字面量)typeof null 返回 "object",这不符合直觉,也容易引发误判。它源于 JavaScript 最初实现时的二进制标识 bug,已成事实标准,无法更改。
若需区分 null,必须额外判断:
立即学习“Java免费学习笔记(深入)”;
typeof x === "object" 来断定是对象——null 也会命中null 应写为:x === null(严格相等)typeof x === "object" && x !== null
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
instanceof 或 toString 方法Object.prototype.toString.call(x).slice(8, -1)(如 [object Array] → "Array")