最可靠的方法是使用 typeof 操作符,它对函数返回字符串 "function";该方法简洁、准确、跨上下文安全,适用于普通函数、箭头函数、异步函数、生成器函数及类。

最可靠的方法是使用 typeof 操作符,它对函数返回字符串 "function"。
用 typeof 判断函数类型(推荐)
typeof 是唯一原生、简洁且在绝大多数场景下准确的方式:
- 对普通函数、箭头函数、异步函数、生成器函数都返回
"function" - 不依赖原型链,不受
Object.prototype.toString被篡改的影响 - 性能好,语法简单
示例:
typeof () => {} === "function" // true
typeof async function(){} === "function" // true
typeof class {} === "function" // true(类本质也是函数)
避免用 instanceof Function
虽然 func instanceof Function 在多数情况下也返回 true,但有明显缺陷:
- 跨 iframe 或不同执行上下文时会失效(因为不同环境的
Function构造器不是同一个引用) - 无法识别箭头函数在某些旧引擎中的边界行为(虽现代环境已统一,但兼容性不如
typeof) - 语义上不够直接——我们关心“是不是函数”,不是“是否由某个特定 Function 构造出来”
慎用 Object.prototype.toString.call()
它可以返回 "[object Function]",但属于“过度设计”:
- 写法冗长:
Object.prototype.toString.call(fn) === "[object Function]" - 仅当需要严格区分内置对象类型(如 RegExp、Date)时才值得用;单判函数没必要
- 若
toString方法被意外覆盖(极少见但可能),结果不可靠
注意几个常见误区
以下判断方式都不合适:
-
typeof fn === "object"❌ —— 函数的typeof不是"object" -
fn.constructor === Function❌ —— 构造器可被修改,且跨上下文失效 -
typeof fn === "function" && fn instanceof Function❌ —— 叠加无意义,反而引入instanceof的问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











