在ES2015中有四种相等算法

ecma规范定义算法规则
7.2.10 SameValue
7.2.11 SameValueZero
7.2.12 SameValueNonNumber
即术语同值同值零同值非零

定义

ECMA中SameValue比较规则

ECMA中SameValueZero比较规则

ECMA中SameValueNonNumber比较规则

SameValue与SameValueZero的差别在于数值类型时+0-0


JavaScript提供三种不同的值比较操作:

Object.is的行为方式与===相同,但是对于NaN和-0和+0进行特殊处理

NaN === NaN // false
Object.is(NaN, NaN) // true

+0 === -0 // true
Object.is(+0, -0) // false

可以看到Object.is采用的SameValue算法,而全等可以看作是SameValueZero排除NaN的情况,因为全等操作符认为 NaN 与其他任何值都不全等,包括它自己。


再来看看非严格等于的隐式转换

在被比较的2个值x和y类型不一样时,总是将2者的类型转换为NumberPrimitve

也就是说,当有一方为number时,另一方也会转换为number;否则,会尝试调用该类型的x.toString()x.valueOf()方法来将Object转换为原始类型。

参考JavaScript 中的相等性判断 Object.is()