new Promise(resolve)和Promise.resolve

王凯
  • 2
新手上路,请多包涵
    let a = new Promise(resolve=>resolve(1))
    let b = new Promise(resolve => resolve(a))
    console.info(a === b)           // false

    b = Promise.resolve(a)
    console.info(a === b)            // true

请问,为什么两个输出结果不一致?

回复
阅读 1.6k
3 个回答

先说下===的底层原理:

=== 比较的原理是先进行类型判断再进行值的比较,同时这里对象的值实际上指的是其存储的指针


分析a === b

  1. 执行完
let a = new Promise(resolve=>resolve(1))
let b = new Promise(resolve => resolve(a))

a 和 b 分别指向了两个对象(promise对象)

  1. 再进行判断
console.log(a === b)

都是promise类型一致,然后进行值的判断。a 和 b分别指向了堆上存储的两个对象,可以理解为 a 存储的是指针0276GGHBC00,b 存储的是指针0276GGHBC01,显然两者不相等。

这篇文章对JS内存原理讲的很透彻,可以看下

promise.resolve当的参数是promise对象时,直接返回这个对象,否则返回一个新的promise对象

b = Promise.resolve(a) // 此时Promise.resolve(a)返回的还是原始对象a

相当于

b = a

所以此时 a 和 b 都指向 a 所指向的promise对象new Promise(resolve=>resolve(1))

因为 === 对比的是对象的引用。

ab 是两个不同的 Promise 对象,因此第一次判断是 false

根据规范,Promise.resolve 的参数如果是一个 Promise,则直接返回该 Promise。

它返回的是promise又不是primitive数据,肯定不一样了。

let a = 1;
const obj1 = { a };
const obj2 = { a };
obj1 === obj2; // false
你知道吗?

宣传栏