typeof 是判断函数类型的首选方法,它对函数返回 "function",对普通对象(含数组、日期等)统一返回 "object",且不受原型链和跨 iframe 影响;需单独处理 null,而识别纯粹普通对象需组合 typeof、null 检查、Array.isArray 和 toString.call。

typeof 本身就能准确区分函数和普通对象——它对函数返回 "function",对普通对象(包括数组、日期、正则等)统一返回 "object"。这是 typeof 少数几个稳定且可靠的判断场景之一。
typeof 判断函数最直接有效
它不依赖原型链、不受跨 iframe 影响,比 instanceof Function 更安全:
-
typeof function(){} === "function"→ ✅ -
typeof () => {} === "function"→ ✅ -
typeof class {} === "function"→ ✅(class 在运行时就是函数) -
typeof {} === "object"→ ✅ -
typeof [] === "object"→ ✅ -
typeof null === "object"→ ⚠️(需单独处理,但不影响函数 vs 对象区分)
所以只要你想知道“这个值是不是函数”,typeof val === "function" 就是首选、简洁、无兼容性风险的写法。
普通对象的识别需要额外过滤
仅靠 typeof val === "object" 不够,因为它还会命中:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
null- 数组
[] -
new Date()、/regex/、new Map()等
若目标是“确认一个值是非函数、非null、非数组的纯粹普通对象”,可组合判断:
-
typeof val === "object" -
val !== null -
!Array.isArray(val) Object.prototype.toString.call(val) === "[object Object]"
例如:
function isPlainObject(val) {
return typeof val === "object" &&
val !== null &&
!Array.isArray(val) &&
Object.prototype.toString.call(val) === "[object Object]";
}不要误用 instanceof 或 constructor 做函数判断
-
val instanceof Function:在 iframe 或沙箱环境可能失效(不同上下文的Function构造器不相等) -
val.constructor === Function:constructor属性可被修改,不可信
typeof 是唯一轻量、安全、无需 try/catch 的函数类型入口检测方式。
不复杂但容易忽略

















