2015-10-30 6 views
3

Я выполняю этот код в FF и Chrome.Обещание строки - [объект Object] или [object Promise]?

Object.prototype.toString.call(Promise.resolve())


Результаты:

  • Firefox Nightly 44 - [object Promise]
  • Хром Канарейки 48 (с флагом) - [object Promise]
  • Хром 46 - [object Object]

Ecma Сценарий specification в главе 25.4.4.5 Promise.resolve (х) цитаты:

Функция решительности возвращает либо новое обещание решить с передаются аргументом, или сам аргумент, если аргумент является обещанием производства этим конструктором.

  1. Пусть C - это значение.
  2. Если тип (C) не является объектом, введите исключение TypeError.
  3. Если IsPromise (х) истинно,
    • Пусть xConstructor будет получить (х, "конструктор").
    • ReturnIfAbrupt (xConstructor).
    • Если SameValue (xConstructor, C) истинно, верните x.
  4. Позвольте обещанию быть способным к NewPromiseCapability (C).
  5. ReturnIfAbrupt (agreementCapability).
  6. Позвольте resolResult быть Call (promcability. [[Resolve]], undefined, «x»).
  7. ReturnIfAbrupt (resolveResult).
  8. Возврат обещания. Возможность [[Обещание]].

So promiseCapability.[[Promise]] toString - результат в браузере.

PromiseCapability запись имеет поле, перечисленное в Table 57:

 
------------------------------------------------------------------- 
| Field Name | Value  | Meaning        | 
------------------------------------------------------------------- 
| [[Promise]] | An object | An object that is usable as a promise | 
------------------------------------------------------------------- 

Так [[Promise]] является объектом и должна быть [object Object].

+1

Согласно http://www.ecma-international.org/ecma-262/6.0/#[email protected]@tostringtag, начальное значение свойства @@ toStringTag представляет собой значение строки "Promise" ». Поэтому 'Object.prototype.toString.call (...)' действительно должен возвращать "[object Promise]" – kangax

ответ

0

Да! Добро пожаловать в ES2015 :)

Это функция реализации Symbol в браузере. SymbolaffectObject.prototype.toString.call по Symbol.toStringTag:

  • Пусть tag быть Get (O, @@toStringTag).
  • ReturnIfAbrupt(tag)
  • Если Type(tag) не String, пусть тег будет builtinTag.
  • Верните String, что является результатом объединения "[object ", tag, and "]".

Так Symbol сделать описание строки по умолчанию объекта obj:

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

Получить более подробную информацию о ES2015 аке ES6 Symbol из этого article.

Смежные вопросы