typeof对函数返回"function",因其在规范中被特殊处理为独立类型;它能可靠识别所有函数(含箭头函数、类构造器等),但无法区分函数与伪造的可调用对象。

typeof 是 JavaScript 中最常用的类型检测操作符,它对函数有明确且一致的返回值:对于任何函数(包括普通函数、箭头函数、类构造器、内置函数等),typeof 都返回字符串 "function"。
为什么 typeof 能可靠识别函数
JavaScript 规范将函数定义为一种特殊的对象(Function 类型),但 typeof 对其做了专门处理——不返回 "object",而是单独归为 "function"。这是少数几个 typeof 返回精确语义的场景之一。
typeof function(){} === "function"typeof (() => {}) === "function"typeof Math.max === "function"-
typeof class A {} === "function"(类在运行时本质是函数)
注意 typeof 无法区分函数和其他可调用对象
typeof 只能告诉你“这是一个函数”,但不能判断它是否真的可安全调用。例如:
-
typeof new Proxy(() => {}, {}) === "function"(Proxy 包裹的函数仍返回"function") -
typeof { [Symbol.toStringTag]: 'Function' } === "object"(伪造标签不影响typeof)
也就是说:返回 "function" ⇒ 一定是函数;但不是所有看起来像函数的对象都会返回 "function"。
立即学习“Java免费学习笔记(深入)”;
实际使用建议
在日常开发中,用 typeof x === "function" 判断函数是最简洁安全的方式,尤其适合参数校验或高阶函数逻辑:
- 避免用
instanceof Function(在跨 iframe 场景下会失效) - 不要依赖
toString()或constructor(易被篡改或不统一) - 若还需确认是否“可调用”,可额外结合
typeof x === "function" && typeof x.call === "function"(通常冗余)
与其他类型的对比(避免误判)
typeof 对其他基础类型返回固定字符串,与函数不混淆:
-
typeof null === "object"(历史 bug,但和函数无关) -
typeof [] === "object",typeof {} === "object" -
typeof undefined === "undefined",typeof 42 === "number"
所以只要检查 === "function",结果就是干净、无歧义的。



















