今天本来打算看一下React 16.3中新的特性,刚打开New context API 这个PR的时候,就看到列的TODO list中的第四条:
Should we use Object.is to compare context values, or is === enough? shallowEqual uses Object.is, but we use === everywhere else.
还真不知道这两中比较方式有什么区别,遂查之。
在Stack Overflow上看到了同样的问题,两个回答都讲得很详细。
Object.is()是ES6中提出的,它与“===”的区别只在于判断+0,-0和NaN时的不同。具体表现如下:
这两种方法的不同比较结果是由于其使用的比较算法不同导致的。“===”运算符使用的比较算法是Strict Equality
,而Object.is()用的是SameValue
。除了这两种比较算法,还有SameValueZero
, SameValueNonNumber
, Abstract Equality
。具体的比较规则在这里。