typeof对函数返回"function",因其具备内部[[call]]属性;其他引用类型(包括数组、正则、日期等)均返回"object",null亦如此;需结合array.isarray()和object.prototype.tostring.call()精确区分具体类型。

typeof 在 JavaScript 中对函数返回 "function",这是它与其他引用类型(如数组、对象、正则、日期等)最明确的区分点——但要注意,这仅适用于**普通函数和箭头函数**,不适用于某些宿主对象或新标准下的特殊内置对象(如 class 构造器在多数引擎中仍被识别为 "function")。
为什么 typeof 能准确识别函数?
ECMAScript 规范将函数定义为一种特殊的可调用对象,其内部属性 [[Call]] 使 typeof 对其实例统一返回 "function"。而其他引用类型(如 {}、[]、/regex/、new Date()、new Map() 等)均不具备该能力,typeof 统一返回 "object"(null 也返回 "object",属历史遗留 bug)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
常见引用类型的 typeof 表现
typeof function(){} === "function"typeof (() => {}) === "function"typeof {} === "object"typeof [] === "object"-
typeof /abc/ === "object"(Chrome/Firefox/Safari;Node.js 同样) typeof new Date() === "object"typeof new Map() === "object"-
typeof null === "object"(需单独判断)
如何安全地区分函数和其他引用类型?
单靠 typeof 可以直接捕获函数,但要进一步区分其他引用类型(比如判断是不是数组或正则),需组合使用:
- 先用
typeof x === "function"判断是否为函数 - 再用
Array.isArray(x)判断数组(比typeof可靠) - 对其他类型,可用
Object.prototype.toString.call(x)获取精确类型标签,例如:Object.prototype.toString.call([])→"[object Array]"Object.prototype.toString.call(/a/)→"[object RegExp]"Object.prototype.toString.call(new Date())→"[object Date]"
注意边界情况
-
typeof class C {}返回"function"(class 是语法糖,本质仍是函数) -
typeof async function() {}和typeof function*() {}也都返回"function" -
typeof document.all在旧浏览器中曾返回"undefined"(已废弃,现代环境无需考虑) -
typeof对 Symbol、BigInt 等新原始类型支持良好:typeof Symbol() === "symbol",typeof 1n === "bigint"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










