【发布时间】:2015-10-30 15:26:24
【问题描述】:
我在 FF 和 Chrome 中执行此代码。
Object.prototype.toString.call(Promise.resolve())
结果:
- Firefox Nightly 44 -
[object Promise] - Chrome Canary 48(带标志)-
[object Promise] - 铬 46 -
[object Object]
25.4.4.5 Promise.resolve(x) 章节中的 EcmaScript specification 引用:
resolve 函数返回一个用 传递的参数,或参数本身,如果参数是一个承诺 由这个构造函数产生。
- 设 C 为 this 值。
- 如果 Type(C) 不是 Object,则抛出 TypeError 异常。
- 如果 IsPromise(x) 为真,
- 设 xConstructor 为 Get(x, "constructor")。
- ReturnIfAbrupt(xConstructor)。
- 如果 SameValue(xConstructor, C) 为真,则返回 x。
- 让 promiseCapability 为 NewPromiseCapability(C)。
- ReturnIfAbrupt(promiseCapability)。
- 让 resolveResult 为 Call(promiseCapability.[[Resolve]], undefined, «x»)。
- ReturnIfAbrupt(resolveResult)。
- 返回 promiseCapability.[[Promise]]。
所以promiseCapability.[[Promise]] toString 是浏览器中的结果。
PromiseCapability Records 的字段列在Table 57:
-------------------------------------------------- ----------------- |字段名称 |价值 |含义 | -------------------------------------------------- ----------------- | [[承诺]] |一个对象 |可用作承诺的对象 | -------------------------------------------------- -----------------所以[[Promise]] 是一个对象,必须是[object Object]。
【问题讨论】:
-
根据ecma-international.org/ecma-262/6.0/…'@@toStringTag属性的初始值为String值“Promise”'。所以
Object.prototype.toString.call(...)确实应该返回“[object Promise]”
标签: javascript google-chrome firefox promise ecmascript-6