判断变量是否为 promise 或可 thenable 对象,核心是检查其是否具有函数类型的 then 方法;instanceof promise 仅适用于同一上下文,而 isthenable(obj) = obj != null && typeof obj.then === 'function' 更通用但需防范误判。

判断一个变量是否为 Promise 或可 thenable 对象,核心是检查它是否具有符合规范的 then 方法,且该方法是函数类型——这是 Promise/A+ 和 ECMAScript 规范中定义“可 thenable”的关键标准。
检查是否为原生 Promise 实例
最直接的方式是使用 instanceof Promise,但它有局限:无法识别跨执行上下文(如 iframe)创建的 Promise,也不适用于自定义实现或 polyfill。
- ✅ 推荐用于同一上下文内快速判断原生 Promise
- ❌ 不适用于子框架、Web Worker 或某些 Promise 库封装对象
判断是否为可 thenable 对象(更通用)
根据 Promise/A+ 规范,“thenable”指拥有可调用的 then 方法的对象。需同时满足两个条件:
- 该值不是
null或undefined typeof obj.then === 'function'
示例实现:
function isThenable(obj) {
return obj != null && typeof obj.then === 'function';
}
注意:这个检查不保证 then 方法行为正确(比如是否接受 onFulfilled/onRejected),仅作初步类型判断,适用于 await 兼容性预检或工具函数中。
避免常见误判
以下情况容易被错误识别为 thenable,需结合业务场景谨慎处理:
- 普通对象带
then属性但非函数(如{ then: 42 })→isThenable返回false,安全 - 类数组对象或函数自身有
then方法(如某些库的链式 API)→ 可能误判,必要时加额外校验(如检查是否也具备catch或是否由已知 Promise 构造器创建) -
Promise.resolve(1)和new Promise(() => {})都满足isThenable→ 符合预期
实际应用建议
在编写泛型异步工具(如 co 类库、useAsync Hook)时:
- 优先用
isThenable做第一层判断 - 若需严格区分原生 Promise,再叠加
obj.constructor === Promise或Promise.prototype.isPrototypeOf(obj) - 不要依赖
toString.call(obj) === '[object Promise]'—— 不可靠,且不可枚举











