JavaScript中判断async函数最可靠方法是正则匹配toString()结果:/^async\s+function\b/.test(fn.toString()),需先校验fn为函数类型,该方案兼容所有主流引擎且避免误判。

JavaScript 中无法直接通过标准 API 判断一个函数是否为 async 函数(即用 async function 声明的函数),但可以通过函数的 toString() 结果和类型特征做可靠检测。
检查函数字符串表示是否以 "async" 开头
这是最常用、兼容性好且足够可靠的方法。所有主流引擎中,async function 的 toString() 都会返回以 "async "(注意空格)开头的字符串,而普通函数、箭头函数、生成器函数等均不会。
- 对
async function foo() {}:`foo.toString()` 返回"async function foo() {}" - 对
function bar() {}或() => {}:不以"async "开头 - 注意:不能只查是否包含
"async",因为函数体里可能有async字符串字面量
结合 instanceof Promise 和返回值类型辅助验证
仅靠字符串检测已足够,但若想进一步确认行为,可调用函数并检查返回值:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
async函数**总是返回 Promise**(即使return 42,也会被包装成Promise.resolve(42)) - 普通函数若返回原始值或非 Promise 对象,则不是
async函数 - ⚠️ 注意:不能直接执行函数(可能有副作用),仅适用于可安全调用的场景;一般推荐只用
toString()检测
完整判断函数是否为 async 函数的工具函数
推荐使用以下简洁可靠的实现:
立即学习“Java免费学习笔记(深入)”;
function isAsyncFunction(fn) {
return fn && typeof fn === 'function' &&
/^async\s+function\b/.test(fn.toString());
}
- 先确保是函数类型,避免对 null/undefined/非函数调用
toString() - 正则
/^async\s+function\b/精确匹配开头的async function(含至少一个空白符,防止误匹配asyncfunction) - 支持具名、匿名、箭头函数(但箭头函数本身不会匹配,符合预期)
不推荐的方法
以下方式不可靠,应避免:
-
fn.constructor.name === 'AsyncFunction':V8 虽有AsyncFunction构造器,但非标准,Firefox/WebKit 不支持 - 检查
fn[Symbol.toStringTag]:该属性可被篡改,且未被规范要求用于 async 函数标识 - 依赖
fn.prototype.constructor:async 函数没有prototype,访问会出错

















