为什么将 javascript promise 传递给 `then` 会导致奇怪的行为?

Why passing javascript promise to `then` results in strange behavior?

在规范的 es6 specification it's stated that passing non-callable to promise then will set promise "on fulfilled" handler into "identity". In another section 中声明 "identity" 是一个计算给定值的函数。根据规范所说,我假设这段代码:

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

等于此代码:

Promise.resolve("foo").then(v => Promise.resolve("bar")).then(v => console.log(v))

但是如果两个代码示例都在最新的 Chrome 或 Firefox 中执行,第一个输出 "foo",第二个输出 "bar"。我在哪里误解了规范?

根据 ECMAScript-6 的 this section,

If [[Handler]] is "Identity" it is equivalent to a function that simply returns its first argument.

所以,你可以把Identity想成下面的箭头函数

(first) => first

那么,你的承诺链

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

实际上变成了

Promise.resolve("foo").then((first) => first).then(v => console.log(v))

这就是您获得 foo 的原因。