typeof能区分函数和普通对象,因函数具有[[call]]内部属性而返回"function",其他引用类型(包括数组、日期、正则、null等)均返回"object",这是基于引擎底层类型标签与可调用性标识的快速判断。

JavaScript 中用 typeof 区分函数和普通对象,关键就一条:函数返回 "function",其他对象(包括数组、日期、正则、普通对象等)一律返回 "object"。
typeof 对函数的检测结果很明确
无论函数怎么定义——函数声明、函数表达式、箭头函数、class(本质也是函数)、甚至异步函数——typeof 都统一返回字符串 "function":
-
typeof function() {}→"function" -
typeof (() => {})→"function" -
typeof async function() {}→"function" -
typeof class {}→"function"
typeof 对普通对象都返回 "object"
只要不是函数,几乎所有引用类型都会被 typeof 归为 "object":
-
typeof {}→"object" -
typeof []→"object" -
typeof new Date()→"object" -
typeof /abc/→"object" -
typeof null→"object"(历史遗留 bug,但属于特例,不是“普通对象”)
为什么能靠这个区分?底层逻辑是什么
JavaScript 引擎给每个值打“类型标签”,函数对象有特殊的内部属性 [[Call]],表示它可被调用。typeof 在读到类型标签为对象(6)时,会额外检查这个属性:有 [[Call]] 就返回 "function",否则返回 "object"。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
这说明:typeof 不是靠构造函数或原型链判断,而是基于引擎底层的可调用性标识——所以它快、轻量、且对所有函数一视同仁。
实际使用建议
日常开发中,最常见也最可靠的写法就是直接比对字符串:
- 检查回调是否可用:
if (typeof callback === 'function') { callback(); } - 参数校验(防御性编程):
if (typeof options?.onSuccess !== 'function') throw new Error('onSuccess must be a function'); - 注意不要混淆:
typeof null === 'object'是 true,但它既不是函数也不是普通对象,需单独处理
如果需要进一步区分数组、日期、Map 等具体类型,typeof 就不够用了,得配合 Array.isArray()、instanceof 或 Object.prototype.toString.call()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










