比较运算符

218 阅读4分钟

1.概述

比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。

  • 比较运算符可以比较各种类型的值,不仅仅是数值 JavaScript提供了8个比较运算符:
  • (>)大于运算符
  • (<)小于运算符
  • (>=)小于等于运算符
  • (>=)大于等于运算符
  • (==)相等运算符
  • (===)严格相等运算符
  • (!=)不相等运算符
  • (!==)严格不相等运算符 以上8中比较运算符分成两类:相等比较和非相等比较。两者的规则不一样:
  • 非相等的比较,算法是先看两个运算子是否都是字符串
  • 如果两个运算子都是字符串,就按照字典顺序比较(比较Unicode码点)
  • 否则,将两个运算子都转成数值,再比较数值的大小

2.非相等运算符:字符串的比较

  • 字符串按照字典顺序进行比较:JavaScript引擎内部首先比较首字符的Unicode码点,如果相等,再比较第二个字符的Unicode码点,以此类推
  • 由于所有字符都有Unicode码点,因此汉字也可以比较

3.非相等运算符:非字符串的比较

如果两个运算子之中,至少有一个不是字符串,需要分成以下两种情况:

  • 原始类型值: 如果两个运算子都是原始类型的值,则是先转成数值再比较。字符串和布尔值都会先转成数值,在进行比较。(任何值与NaN使用非相等运算符进行比较,返回的都是false)
  • 对象: 如果运算子是对象,会转为原始类型的值再进行比较。对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。两个对象之间比较也是按此规则。

4.严格相等运算符

JavaScript提供两种相等运算符:== 和 ===。

  • 相等运算符(==)是比较两个值是否相等
  • 严格相等运算符(===)是比较它们是否为“同一个值” 如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将他们转换成同一个类型,再用严格相等运算符进行比较。
  • 不同类型的值: 如果两个值的类型不同,直接返回false
  • 同一类的原始类型值: 同一类型的原始类型值(number、string、boolean)比较时,值相同就返回true,值不同就返回false(十进制的1和十六进制的1,类型和值都相同,所以返回true),需要注意,NaN与任何值都不相等(包括自身),正0等于负0。
  • 复合类型值: 两个复合类型值(object、array、function)比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。(1)比较两个空对象、两个空数组、两个空函数,结果都是不相等,因为它们的值都存放在不同的地址,结果当然是false。(2)如果两个变量引用同一个对象,则他们相等。注意,对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。
  • undefined和null undefined和null与自身严格相等

5.严格不相等运算符

严格不相等运算符有一个对应的“严格不相等运算符”(!==),它的算法就是先求严格相等运算符的结果,然后返回相反值。

6.相等运算符

相等运算符用于比较相同类型的数据时,与严格相等运算符完全一样。比较不同类型的数据时,相等运算符会先将数据进行类型转换(隐式),再用严格相等运算符比较。

  • 原始类型值:会被先转换成数值再比较。将字符串和布尔值都转为数值再进行比较。
  • 对象与原始类型值比较:广义的对象(object、array、function)与原始类型值比较,对象转换成原始类型的值再比较。先调用对象的valueOf方法,如果得到的还是对象,再调用toString方法得到字符串形式再比较。
  • undefined和null:undefined和null只有与自身比较或者相互比较时,才返回true;与其他类型比较结果都为false。
  • 相等运算符的缺点:相等运算符隐藏的类型转换,会带来一些违反直觉的结果,容易出错,因此不建议使用相等运算符(==),最好只使用严格相等运算符(===)。

7.不相等运算符

相等运算符有一个对应的不相等运算符(!=),它的算法是先求相等运算符的结果,然后返回相反值。