一个题考察对Promise的掌握情况

近半年面试了很多的人,其中不乏高级前端开发,而对Promise这个现代前端异步基础掌握得实在是惨不忍睹,除了烂大街的考察事件循环中Promise执行顺序的问题,以下这个题也是一个很好的考察点,问,以下代码输出什么?

Promise.resolve(x).then((y) => console.log(x === y))

如果你脱口而出 truefalse ,那显然是欠考虑的。

而如果对 Promise 的发展稍有研究,其实就会发现这是考察 Promise Resolution Procedure ,根据 Promise/A+ 中的描述,x 应当分如下情况考虑:

  1. xPromise 对象
    1.1 若 xResolved 状态的 Promise ,则 yx 的value,输出 false
    1.2 若 xRejected 状态的 Promise ,则不会进入上面的回调,什么也不会输出
    1.3 若 xPendding 状态的 Promise ,则等待x状态发生变化,再走 1.11.2 的决议

  2. x 是函数或对象, 取 then = x.then
    2.1 若上述过程抛出异常,则不会进入 y 所在的回调函数,什么也不会输出
    2.2 若 then 不是一个函数,则决议值为 x ,输出 true
    2.3 若 then 为函数,则调用该函数,传入 resolvePromiserejectPromise两个函数
    2.3.1 若 rejectPromise 被调用,则不会进入 y 所在回调,什么也不会输出
    2.3.2 若 resolvePromise 被调用,则走决议流程 1
    2.3.3 若在 then 内调用 resolvePromise 之前发生异常,则不会进入 y 所在回调,什么也不会输出

  3. x 非上述其他情况,则决议为 x ,即输出 true (其实还要考虑NaN的情况😄)