![现代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=1739457283-Y5dQIPMaRTnRob6MkyskHNRliI4xuiVZ-0-2b64addedf147ce80c591f6e758f3897)
符号“<”为小于运算符,当第1个操作数小于第2个操作数时,结果为true,否则结果为false。“>”为大于运算符,当第1个操作数大于第2个操作数时,结果为true,否则结果为false。需要额外注意,在ECMAScript中,等于运算符用符号“==”来表示,这和数学中的“=”有些差异,初学者容易混淆,需特别注意。
比较运算符也可以用于字符串与字符串之间的比较操作,字符串的比较遵守这样的法则:逐字符进行字符码大小的比较,如果字符码相同,就比较下一个字符,直到比较出结果或者比较完所有字符。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_67227.jpg?sign=1739457283-VezL6BzpayBk1mrIfGDCksJNWXxd13Ab-0-48513656fc450b21c62238f4b687b1ae)
需要特别注意,如果是描述数字的字符串,比较时依然会遵守上面的法则,例如:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_38253.jpg?sign=1739457283-v87auNBR5dFen0fycuDaSHeS3s3YT1pO-0-f6623d59e516a97dcc410d8fc93d0f47)
“12”>“3”的比较结果返回的是false,这是正确的。因为JavaScript解释程序会将字符“1”与字符“3”的字符码进行比较,将结果返回。
数字和字符串进行比较相对要棘手些。首先,如果是描述数字的字符串与数字进行比较,JavaScript解释程序会将字符串强制转换成数字类型后再进行比较,例如:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_69116.jpg?sign=1739457283-VOfaOu2lpGvo9aFfdIjaVnBBjCxqjdoN-0-f83e35840c51960dc81e778004b03096)
如果是非数字的字符串与数字进行比较,结果将永远是false。
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P48_69117.jpg?sign=1739457283-7GlydnUxUY97jVeKh1sYxw7qyft11LL3-0-2b7f07f526284657e51e9dd570ce9f1b)
ECMAScript中还可以使用“>=”与“<=”进行不小于和不大于的比较运算,其规则和“>”符号与“<”符号一致。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P49_69118.jpg?sign=1739457283-4qJUW7RltwLwzDH9x0ds17Tti3gy5UTY-0-4f521ce7262ec8f160b8b39451a7c937)
关于等于与不等于的比较,在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=1739457283-PTx7nQouLMwKEBGVXE8F92ulINrVb15N-0-105c0e4abd11e8cef047ea86588fc30b)
需要注意,如果进行比较操作的是引用值而非原始值,则比较的实际是所引用对象的地址。
再次提醒,NaN与NaN进行相等比较,结果是false。
“==”与“!=”运算在进行比较前,会根据上面的规则对操作数进行类型的转换,全等运算符“===”与不全等运算符“!==”在比较前不会做任何类型转换,换句话说,全等和不全等进行比较时,既会比较类型,又会比较值,只有类型和值完全相等的两个操作数才被认为是全等。示例如下:
![](https://epubservercos.yuewen.com/534FF6/15253386804113806/epubprivate/OEBPS/Images/Figure-P49_69127.jpg?sign=1739457283-ySrFX1zyWG5SFv9OLYBPOvzDaXMK8KQw-0-c8a9d29bb2d4858358ba383b8b78a57e)
有一个很有趣的小例子,在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=1739457283-PtZVFhmOeWLJEIi3vnadpB8ENd0iVeXF-0-f32412d4887c8893d50062a94e694787)