js中的等式比较

在ES2015中有四种相等算法

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

  • 抽象相等 ==
  • 严格相等 ===,用于
    • Array.prototype.indexOf
    • Array.prototype.lastIndexOf
  • 同值零,用于
    • Map
    • Set
    • String.prototype.includes
    • ArrayBuffer构造函数
    • TypedArray构造函数
  • 同值,用于剩余的其他地方

定义

ECMA中SameValue比较规则

  • 类型不一样,返回false
  • 类型为number
    • 都为NaN,返回true
    • x为+0,y为-0时,返回false
  • 类型不是number时,return SameValueNonNumber()

ECMA中SameValueZero比较规则

  • 类型不一样,返回false
  • 类型为number
    • 都为NaN,返回true
    • x为+0,y为-0时,返回true
  • 类型不是number时,return SameValueNonNumber()

ECMA中SameValueNonNumber比较规则

  • Undefined,返回true
  • Null,返回true
  • String,则比较这2个字符串的码点
  • Object,则比较是否指向同一个堆地址

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


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

  • ==
  • ===
  • Object.is

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()


Author: Juntech
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Juntech !
评论
  TOC