javascript中无法用typeof或instanceof区分普通函数和箭头函数,需综合tostring()含"=>"、prototype是否存在、new调用是否报错等特征判断。

JavaScript 中无法通过 typeof 或 instanceof 直接区分普通函数和箭头函数,因为两者都返回 "function"。真正可靠的判断方式,是结合函数字符串表示、构造器属性和运行时行为特征来综合识别。
看函数的 toString() 字符串形式
这是最常用且兼容性好的方法。调用函数的 toString() 方法,检查其源码是否包含 => 符号:
- 普通函数(声明或表达式)返回形如
"function name() { ... }"或"function () { ... }" - 箭头函数返回形如
"(a, b) => a + b"或"() => { ... }",一定含=>
注意:该方法对经过压缩/混淆、或被 bind/proxy 包裹的函数可能失效,但对原始定义有效。
检查 prototype 属性是否存在
普通函数自动拥有 prototype 属性(值为对象),而箭头函数没有:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
function foo() {}→foo.prototype是一个对象(有constructor) -
const bar = () => {}→bar.prototype是undefined
可封装为判断逻辑:typeof fn === 'function' && fn.prototype !== undefined 基本可认定为普通函数(排除极少数手动删除 prototype 的非常规情况)。
尝试 new 调用并捕获错误
箭头函数不可被 new 调用,会立即抛出 TypeError: xxx is not a constructor;普通函数则不会(即使逻辑上不适合作为构造器,语法上也允许):
- 安全做法:用
try/catch尝试new fn(),若报错且错误信息含"not a constructor",大概率是箭头函数 - 不推荐在生产环境频繁使用,仅作调试或工具函数内部判定
注意边界情况
有些函数看似“像箭头”,实则不是:
- Generator 函数(
function*)、async 函数(async function)虽不是箭头函数,但也没有传统arguments,prototype行为也略有不同 - 类方法、getter/setter 内部的函数体不属于独立函数,不能单独判断类型
- 通过
Function构造器动态创建的函数,toString()返回"function anonymous() { [native code] }",无法识别
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










