要查看给定对象是否为ES6 Promise,我们可以使用以下谓词:
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Call
荷兰国际集团toString
直接从Object.prototype
返回一个原生字符串表示,其是给定对象类型的"[object Promise]"
在我们的例子。这样可以确保给定的对象
- 绕过误报,例如..:
- 具有相同构造函数名称的自定义对象类型(“ Promise”)。
toString
给定对象的自写方法。
- 与
instanceof
或相比,可跨多个环境上下文(例如iframe)工作isPrototypeOf
。
但是,任何通过标签修改了其标签的特定宿主对象都可以返回。取决于项目,这可能是预期结果,也可能不是预期结果(例如,是否有自定义的Promise实现)。Symbol.toStringTag
"[object Promise]"
要查看对象是否来自本地ES6 Promise,可以使用:
function isNativePromise(p) {
return p && typeof p.constructor === "function"
&& Function.prototype.toString.call(p.constructor).replace(/\(.*\)/, "()")
=== Function.prototype.toString.call(/*native object*/Function)
.replace("Function", "Promise") // replacing Identifier
.replace(/\(.*\)/, "()"); // removing possible FormalParameterList
}
根据这个和这个部分的规范的,函数的字符串表示应该是:
“函数标识符(FormalParameterList opt){ FunctionBody }”
上面已对此进行了相应处理。该函数体是[native code]
在所有主流浏览器。
MDN: Function.prototype.toString
这也适用于多种环境。
.then
方法,但这并不能告诉您您所拥有的绝对是一个承诺。到那时,您所知道的就是您拥有一些可以公开.then
方法的东西,例如 Promise。