![现代JavaScript编程:经典范例与实践技巧](https://wfqqreader-1252317822.image.myqcloud.com/cover/657/26793657/b_26793657.jpg)
2-14 关系运算符
在代码的编写过程中,比较操作十分常用,例如比较两个字符串是否相同、比较两个数字的大小等。比较运算符的计算结果将会返回一个布尔值,通过布尔值的真或假可以实现不同的业务逻辑。
数字之间的比较是最常规的比较,示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_67226.jpg?sign=1739320139-3oLizgvsGGBSmp6pDM1hsbCF5mcCKPpH-0-cb76e4bd5d7606ee77b07d73c0b12fc5)
符号“<”为小于运算符,当第1个操作数小于第2个操作数时,结果为true,否则结果为false。“>”为大于运算符,当第1个操作数大于第2个操作数时,结果为true,否则结果为false。需要额外注意,在ECMAScript中,等于运算符用符号“==”来表示,这和数学中的“=”有些差异,初学者容易混淆,需特别注意。
比较运算符也可以用于字符串与字符串之间的比较操作,字符串的比较遵守这样的法则:逐字符进行字符码大小的比较,如果字符码相同,就比较下一个字符,直到比较出结果或者比较完所有字符。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_67227.jpg?sign=1739320139-sXkI1Il2YQgPln7W2gIVv15KjcxnXOv2-0-ba30a6ae7a56911eb1e4f9f2df32eb25)
需要特别注意,如果是描述数字的字符串,比较时依然会遵守上面的法则,例如:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_38253.jpg?sign=1739320139-v4DvdUKKCWnLN4C2wv7rq2J1DQOQCrIN-0-94c09245fc64f3942ba6b4b91cd59f7c)
“12”>“3”的比较结果返回的是false,这是正确的。因为JavaScript解释程序会将字符“1”与字符“3”的字符码进行比较,将结果返回。
数字和字符串进行比较相对要棘手些。首先,如果是描述数字的字符串与数字进行比较,JavaScript解释程序会将字符串强制转换成数字类型后再进行比较,例如:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_69116.jpg?sign=1739320139-Mz5TzKFBSbmRCbDKEmuv82ZEBEbla6G0-0-12adbf26a56ab830901a87e2be856c94)
如果是非数字的字符串与数字进行比较,结果将永远是false。
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_69117.jpg?sign=1739320139-Zmv8JjaxMLOlmx1Wb1Ia34aJBX5b3aHD-0-f377e96f6d2ed3032f5949bab44cfec3)
ECMAScript中还可以使用“>=”与“<=”进行不小于和不大于的比较运算,其规则和“>”符号与“<”符号一致。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P49_69118.jpg?sign=1739320139-ffrxa7AxdRMIHxkvENx7Sd54zJq4HIcz-0-8253d540aa3e71c0ea889332c8e2ec8d)
关于等于与不等于的比较,在ECMAScript中有两类:一类是相等比较“==”与不相等比较“!=”;另一类是全等比较“===”与不全等比较“!==”。全等比较运算并非是ECMAScript语言所独有的,许多编程语言中都有类似的运算符,例如Swift。
在进行相等或不相等比较时,不同类型间数据的比较遵守如下几条原则:
(1)布尔值在比较运算前会被转换成数值,true转换成1,false转换成0。
(2)描述数字的字符串与数字进行比较前会被转换成数字。
(3)对象和字符串进行比较前,会将对象转换成字符串”[object Object]"。
(4)null值和undefined值进行相等比较,结果为true。
示例代码如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P49_67234.jpg?sign=1739320139-ArMdantxQiMAQPl9qeTNZxH6elmEPeKE-0-c3da3b4ca46c9a69be16fe2d64d4850a)
需要注意,如果进行比较操作的是引用值而非原始值,则比较的实际是所引用对象的地址。
再次提醒,NaN与NaN进行相等比较,结果是false。
“==”与“!=”运算在进行比较前,会根据上面的规则对操作数进行类型的转换,全等运算符“===”与不全等运算符“!==”在比较前不会做任何类型转换,换句话说,全等和不全等进行比较时,既会比较类型,又会比较值,只有类型和值完全相等的两个操作数才被认为是全等。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P49_69127.jpg?sign=1739320139-XpQ9bIjdvKJgc02zzCn98careGqdLAwx-0-d59f2745d4c28f076ffff1b7918ccbf7)
有一个很有趣的小例子,在JavaScript中,如果下面的代码输出false:
console.log(ex>1);
那么如下代码将一定输出true么?
console.log(ex<=1);
答案是否定的,如果ex变量在进行比较转换时被转换成了NaN,那么上面两句输出的都将是false:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P50_69128.jpg?sign=1739320139-O1Bf8zzqD76HEbryBuMmACcQLKtMjVb0-0-eab0bc5507756f0d4ac112779d2fcd58)