Я выполняю этот код в 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 (х) цитаты:
Функция решительности возвращает либо новое обещание решить с передаются аргументом, или сам аргумент, если аргумент является обещанием производства этим конструктором.
- Пусть C - это значение.
- Если тип (C) не является объектом, введите исключение TypeError.
- Если IsPromise (х) истинно,
- Пусть xConstructor будет получить (х, "конструктор").
- ReturnIfAbrupt (xConstructor).
- Если SameValue (xConstructor, C) истинно, верните x.
- Позвольте обещанию быть способным к NewPromiseCapability (C).
- ReturnIfAbrupt (agreementCapability).
- Позвольте resolResult быть Call (promcability. [[Resolve]], undefined, «x»).
- ReturnIfAbrupt (resolveResult).
- Возврат обещания. Возможность [[Обещание]].
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]
.
Согласно http://www.ecma-international.org/ecma-262/6.0/#[email protected]@tostringtag, начальное значение свойства @@ toStringTag представляет собой значение строки "Promise" ». Поэтому 'Object.prototype.toString.call (...)' действительно должен возвращать "[object Promise]" – kangax