比较运算符
=====Object.is()
==
非严格相等。如果对比的值类型不同,则会自动将值隐式转换。
NaN不等于包含它在内的任何东西- -0与0相等
null等于null和undefined- 操作值可以自动转换为
String、Boolean、Number String类型比较区分大小写- 两个操作值如果引用同一个对象,返回
true,否则false - 请记住6个虚值(
null,undefined, `` ,0,NaN,false)
===
严格相等。不进行隐士类型转换。
NaN不等于包含它在内的任何东西- -0等于0
null等于null,但不等于undefinedString严格区分大小写- 两个操作值如果引用同一个对象,返回
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代替
总结
- 这三个比较运算符都非常有用,当进行一些普遍的比较时,则推荐使用
===,而不是== - 如果只判断一个变量值是否为
null或者变量未定义时使用==,因为此时等价于obj===null||obj===undefined - 当遇到
NaN、0、+0、-0较为特殊的比较时,还是推荐使用Object.is()(切记兼容性)
问题:
Array.prototype.indexOf()使用了哪一个运算符?
答案是===。