typeof对函数返回"function",对数组、日期、正则、null等所有其他引用类型均返回"object";它仅粗粒度区分基本类型、函数与其余对象,无法识别具体引用子类型。

typeof 对函数和对象的返回结果不同,核心在于它区分“可调用的函数”与“普通对象”,但对多数对象类型(包括数组、正则、null)不加细分。
函数一律返回 "function"
只要值是函数(无论声明式、表达式、箭头函数、class、内置构造器如 Date 或 RegExp),typeof 都返回字符串 "function":
typeof function(){} // "function"typeof () => {} // "function"typeof class {} // "function"-
typeof Date // "function"(Date 构造器本身是函数) -
typeof RegExp // "function"(同理)
对象统一返回 "object",但有例外
除函数外,几乎所有引用类型——包括数组、普通对象、null、正则字面量、Date 实例、Math、JSON 等——typeof 都返回 "object":
typeof {} // "object"typeof [] // "object"-
typeof null // "object"(历史遗留 bug,非设计本意) -
typeof /abc/ // "object"(现代标准;旧版 Safari/Chrome 曾返回 "function") typeof new Date() // "object"typeof Math // "object"
为什么不能靠 typeof 区分数组、日期、正则?
因为 typeof 的设计目标不是精细识别引用类型,它只做最粗粒度的分类:基本类型 + 函数 + 其余一切归为 object。所以:
- 想判断是否为数组,用
Array.isArray()或instanceof Array - 想判断是否为日期,用
value instanceof Date或Object.prototype.toString.call(value) === "[object Date]" - 想判断是否为正则,用
value instanceof RegExp或toString.call(value)
注意:null 是特例,不是对象
typeof null 返回 "object",但这不代表 null 是对象。它是一个独立的原始值,语义上表示“空值”或“无对象”。该行为是 ECMAScript 规范明确保留的历史错误,所有引擎均遵循。

















