【问题标题】:Promise to string - [object Object] or [object Promise]?对字符串的承诺 - [object Object] 或 [object Promise]?
【发布时间】: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 函数返回一个用 传递的参数,或参数本身,如果参数是一个承诺 由这个构造函数产生。

  1. 设 C 为 this 值。
  2. 如果 Type(C) 不是 Object,则抛出 TypeError 异常。
  3. 如果 IsPromise(x) 为真,
    • 设 xConstructor 为 Get(x, "constructor")。
    • ReturnIfAbrupt(xConstructor)。
    • 如果 SameValue(xConstructor, C) 为真,则返回 x。
  4. 让 promiseCapability 为 NewPromiseCapability(C)。
  5. ReturnIfAbrupt(promiseCapability)。
  6. 让 resolveResult 为 Call(promiseCapability.[[Resolve]], undefined, «x»)。
  7. ReturnIfAbrupt(resolveResult)。
  8. 返回 promiseCapability.[[Promise]]。

所以promiseCapability.[[Promise]] toString 是浏览器中的结果。

PromiseCapability Records 的字段列在Table 57:

-------------------------------------------------- ----------------- |字段名称 |价值 |含义 | -------------------------------------------------- ----------------- | [[承诺]] |一个对象 |可用作承诺的对象 | -------------------------------------------------- -----------------

所以[[Promise]] 是一个对象,必须是[object Object]

【问题讨论】:

标签: javascript google-chrome firefox promise ecmascript-6


【解决方案1】:

是的!欢迎来到 ES2015 :)

这是Symbol 在浏览器中实现的功能。 SymbolaffectObject.prototype.toString.callSymbol.toStringTag:

  • tag 成为Get (O, @@toStringTag)
  • ReturnIfAbrupt(tag)
  • 如果Type(tag) 不是String,则设标签为builtinTag
  • 返回String,这是连接"[object ", tag, and "]"的结果。

所以Symbol 使对象obj 的默认字符串描述:

'[object '+obj[Symbol.toStringTag]+']'

从此article 获取有关 ES2015 又名 ES6 Symbol 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 2021-09-14
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多