答案是:箭头函数没有prototype属性,因此可通过typeof fn === 'function' && !fn.hasownproperty('prototype')可靠判断。该方法兼容性好、无副作用,优于tostring()解析或new调用测试。

JavaScript 没有内置的 isArrowFunction() 方法,但可以通过它的本质特征可靠判断:箭头函数没有 prototype 属性,也不能作为构造函数使用。
看 prototype 属性是否存在
这是目前最稳定、兼容性最好的方式。普通函数(包括函数声明、函数表达式、类方法等)都有 prototype,而箭头函数没有。
- 先确认参数确实是函数:
typeof fn === 'function' - 再检查是否没有
prototype:fn.prototype === undefined或!fn.hasOwnProperty('prototype') - 组合起来写成工具函数:
✅ 对绝大多数场景有效;⚠️ 注意:bind() 后的函数、某些内置函数(如 JSON.stringify)也可能没有 prototype,需结合上下文排除。
避免用 toString() 解析字符串
有人尝试用 fn.toString().includes('=>'),但这不可靠:
- 代码压缩后箭头符号可能被移除或混淆
- 转译(如 Babel)会把箭头函数编译为普通函数
- 函数体含
=>字符串时会误判(比如注释或模板字面量里)
所以不建议依赖字符串形式做判断。
不要靠 new 调用测试
虽然箭头函数调用 new fn() 会报错,但这样做有副作用:
- 执行函数体可能产生意外逻辑(比如发起请求、修改状态)
- 部分函数即使不是箭头函数,本身也不支持
new(如Array.prototype.map) - 错误类型可能被
try/catch掩盖,影响判断准确性
运行时行为不是类型标识,不适合作为判断依据。
真正需要关心的是“它怎么用”,而不是“它是什么”
日常开发中,更实用的问题通常是:
- 这个函数的
this是谁?→ 看它是不是箭头函数(继承外层),还是普通函数(取决于调用方式) - 能不能用
new实例化?→ 箭头函数直接拒绝,普通函数通常可以(除非显式返回对象) - 有没有
arguments?→ 箭头函数没有,得用剩余参数...args
比起纠结类型,优先关注行为表现和实际约束更高效。











