Js比较相等(==和===、Object.is)

229 阅读2分钟

比较运算符

  • ==
  • ===
  • Object.is()

==

非严格相等。如果对比的值类型不同,则会自动将值隐式转换。

  • NaN不等于包含它在内的任何东西
  • -0与0相等
  • null等于nullundefined
  • 操作值可以自动转换为StringBooleanNumber
  • String类型比较区分大小写
  • 两个操作值如果引用同一个对象,返回true,否则false
  • 请记住6个虚值(null, undefined, `` , 0 , NaN , false)

===

严格相等。不进行隐士类型转换。

  • NaN不等于包含它在内的任何东西
  • -0等于0
  • null等于null,但不等于undefined
  • String严格区分大小写
  • 两个操作值如果引用同一个对象,返回true,否则false

Object.is()

在检查两个操作值是否相等时,用到了以下规则:

规则1:操作值均未被定义(undefined)

示例

let a
let b
Object.is(a,b) // true
复制代码

规则2:操作数都是相同长度和顺序的字符串

示例

Object.is('Comparison Operators', 'Comparison Operators') // true
// 然而
Object.is('Comparison Operators', 'comparison Operators') // false, 严格区分大小写
复制代码

规则3:操作值均为null

示例

Object.is(null, null) // true
Object.is(null, 'null') // false
复制代码

规则4:操作值为对象且引用地址相同

示例

let a = {"name": "Arwa"}
let b = a

Object.is(a, b) // true

Object.is({"name": "Arwa"}, {"name": "Arwa"}) // false

Object.is(window, window) // true,均引用了同一个全局变量
复制代码

规则5:操作值均未非0和非NaN数

示例

Object.is(1,1) // true
复制代码

规则6:操作值都是+0或-0

示例

Object.is(0,0) // true
//但是
Object.is(0, -0) //false,这点就不同于==和===
复制代码

规则7:操作值为NaN

示例

Object.is(NaN, NaN) // true,这点也和==和===不同
Object.is(NaN,0/0) // true
复制代码

注意:Object.is()不支持IE,因此请使用polyfill代替

总结

  1. 这三个比较运算符都非常有用,当进行一些普遍的比较时,则推荐使用===,而不是==
  2. 如果只判断一个变量值是否为null或者变量未定义时使用==,因为此时等价于obj===null||obj===undefined
  3. 当遇到NaN、0、+0、-0较为特殊的比较时,还是推荐使用Object.is()(切记兼容性)

问题:

Array.prototype.indexOf()使用了哪一个运算符?

答案是===。

参考

【译】 == vs === vs Object.is()

理清JS中等于(==)和全等(===)那些纠缠不清的关系