Skip to content

比较运算符有以下几个

  • 小于 <
  • 大于 >
  • 小于等于 <=
  • 大于等于 >=
  • 等于 ==
  • 不等于 !=
  • 严格等于 ===
  • 严格不等于 !==

很显然,不管是哪个运算符,返回的结果都只有两种情况,比如 a>b,要么是大于,要么是不大于,所以比较运算符的返回结果一定是布尔型。

js
console.log(2>2);
console.log(2>=2);
console.log(2<2);
console.log(2<=2);
console.log(2==2);
console.log(2!=2);

一般来说,我们要把两个东西作比较,比较的肯定是数字,并且对于数字的比较完全是符合我们直觉的,所以对于数字的比较并不费过多笔墨赘述。

可能要注意的细节是,算术运算符的优先级高于比较运算符

js
console.log(2 >= 1+1);

在这个例子中,由于算术运算符优先级更高,所以会先运算 1+1,然后就是 2>=2,结果必然为 true

一般来说,我们都是对两个数字进行比较,但在一些特殊场景下,我们可能要对字符串进行比较,以下介绍字符串的比较规则。

字符串的比较就是一句话,按位比较 ASCII 码,字符的都是按照 ASCII 码存储的,字符串就是由很多很多字符组成,当两个字符串进行比较的时候,会比较其 ASCII 码,下举例说明,例如 "abc" 和 bcd 进行比较,先看第一位,b 的 ASCII 码大于 a,所以最后的结果就是小于,我们可以用 "abc"<"bcd" 进行验证。再看一个例子,"abc" 和 "ac" 进行比较,先看第一位,都是 "a",ASCII 码一样,就看第二位,此时 b 的 ASCII 码小于 c,所以结果就是小于,可以用 "abc"<"ac" 来验证,接下来看 "abc" 和 "ab" 的比较,第一位和第二位都一样,看第三位,第一个字符串的第三位为 "c",第二个字符串没有第三位,你可以直接理解为 0,所以直接大于,可以用 "abc">"ab" 来验证。

以上就介绍了字符串的比较规则,就是按位比较 ASCII 码,这里给出 ASCII 码表供参考。

ASCII 值控制字符ASCII 值控制字符ASCII 值控制字符ASCII 值控制字符
0NUT32(space)64@96、
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

根据 ASCII 码,我们再看以下刚才的例子,例如 "abc" 和 "ad" 进行比较,第一位一样,看第二位,"b" 的 ASCII 码为 98,d 的 ASCII 码为 100,所以明显就是 "abc"<"ad"

对于两个引用类型的比较,比较的是地址,JS 是弱类型语言,几乎涉及不到地址的概念,所以并不赘述

以上就是我们最常用的比较,接下来考虑一些比较奇怪的情况。

  • 两个原始类型进行比较,则都转换为数字进行比较,例如 "123" 和 123 比较就是相等
  • 只要有 NaN 参与的比较,得到的结果一定是 false,例如 NaN >= 0 得到的是 false,NaN < 0 得到的也是 false,比如 "abc">1,由于是字符串和原式类型进行比较,都会转换为数字,"abc" 转换后为 NaN,这是有 NaN 参与的比较,返回 false,设置 NaN == NaN 也是 false,NaN 不等于他自己
  • Infinity 比任何数字都大,-Infinity 比任何数字都小
  • 如果比较的两边有一个是对象,将对象转换为原始类型再进行比较,目前阶段对象转换为原式类型就是转换为字符串。

读者会发现相等比较其实有两个,相等和严格相等,即 == 和 ===,这两个都可以做相等判断,但彼此是有区别的。

不论是相等还是严格相等,都是用于判断两个数据是否相等的,也有配套的不相等和严格不相等,用于判断两个数据是否不相等。对于相等比较有一些非常违反直觉的地方。

普通的相等,即 ==

  • null == undefined,这个返回 true,也就是说 null 和 undefined 相等。
  • null 和 undefined 和其他原式类型比较均不相等。
  • 如果没有 null 和 undefined,且不是两个字符串进行比较,则按照前面不等的规则进行比较,两个字符串按照 ASCII 码比较,或者先转换为数字再比较,例如 "123"==123,这个就是按照前面的规则,将 "123" 转换为 123 比较,结果为 true
  • NaN 参与的比较均为 false,相等也不例外
  • Infinity 和-Infinity 只和自身相等

我们发现这种相等比较对于不同类型的数据处理很恶心,所以我们不要使用这种两个等号的等于,我们一般使用严格相等和严格不相等,即三个等号。

严格相等要求两端的数据类型和数据值都必须相同,是非常符合直觉的。

只要有 NaN 参与的比较全是 false,严格相等也一样,例如 NaN === NaN 返回 false

以笔记为镜,可以知得失