typeof 对 symbol 和 bigint 原生支持,返回 "symbol" 和 "bigint";但对 promise、proxy、typedarray、weakmap 等新类型均返回 "object";函数类新特性(class、箭头函数、async 函数)仍正确识别为 "function";精准识别需结合 object.prototype.tostring.call、instanceof 或专用 api。

typeof 对现代 JavaScript 新特性整体支持良好,但存在明显断层:它能原生识别 ES6+ 引入的 Symbol 和 ES10 的 BigInt,却对后续新增的许多重要类型“视而不见”,返回统一的 "object" —— 这不是设计疏忽,而是语言演进与历史兼容性权衡的结果。
支持的新类型:Symbol 和 BigInt
这两类是目前 typeof 原生支持的“新成员”:
-
Symbol:无论是否带描述符,
typeof Symbol()或typeof Symbol("id")都返回"symbol" -
BigInt:使用
n后缀或BigInt()创建的值,typeof 123n或typeof BigInt(456)均返回"bigint"
不支持的新类型:一律归为 "object"
以下类型在规范中属于独立构造器或内置对象,但 typeof 无法区分,全部返回 "object":
-
Promise:
typeof Promise.resolve(1)→"object" -
Proxy:
typeof new Proxy({}, {})→"object" -
TypedArray(如
Uint8Array、Float32Array):typeof new Uint8Array(4)→"object" -
WeakMap / WeakSet:
typeof new WeakMap()→"object" -
AggregateError、FinalizationRegistry 等较新内置类实例同样返回
"object"
函数类新特性仍被正确识别
尽管是新语法,只要本质是可调用对象,typeof 就保持一贯可靠:
-
class 声明:
typeof class A {}→"function"(class 在 JS 中本质是语法糖,编译后仍是函数) -
箭头函数:
typeof () => {}→"function" -
async 函数:
typeof async () => {}→"function"
替代方案:精准识别必须组合其他方法
仅靠 typeof 已无法覆盖现代 JS 类型生态。实际判断时需搭配:
- 用
Object.prototype.toString.call(value)获取标准标签,如[object Promise]、[object Uint8Array] - 用构造器检测:例如
value instanceof Promise(注意跨 iframe 限制) - 用专用 API:如
Array.isArray()、isFinite()(数值)、globalThis.Promise === value.constructor(谨慎使用)











