
2-14 关系运算符
在代码的编写过程中,比较操作十分常用,例如比较两个字符串是否相同、比较两个数字的大小等。比较运算符的计算结果将会返回一个布尔值,通过布尔值的真或假可以实现不同的业务逻辑。
数字之间的比较是最常规的比较,示例如下:

符号“<”为小于运算符,当第1个操作数小于第2个操作数时,结果为true,否则结果为false。“>”为大于运算符,当第1个操作数大于第2个操作数时,结果为true,否则结果为false。需要额外注意,在ECMAScript中,等于运算符用符号“==”来表示,这和数学中的“=”有些差异,初学者容易混淆,需特别注意。
比较运算符也可以用于字符串与字符串之间的比较操作,字符串的比较遵守这样的法则:逐字符进行字符码大小的比较,如果字符码相同,就比较下一个字符,直到比较出结果或者比较完所有字符。示例如下:

需要特别注意,如果是描述数字的字符串,比较时依然会遵守上面的法则,例如:

“12”>“3”的比较结果返回的是false,这是正确的。因为JavaScript解释程序会将字符“1”与字符“3”的字符码进行比较,将结果返回。
数字和字符串进行比较相对要棘手些。首先,如果是描述数字的字符串与数字进行比较,JavaScript解释程序会将字符串强制转换成数字类型后再进行比较,例如:

如果是非数字的字符串与数字进行比较,结果将永远是false。

ECMAScript中还可以使用“>=”与“<=”进行不小于和不大于的比较运算,其规则和“>”符号与“<”符号一致。示例如下:

关于等于与不等于的比较,在ECMAScript中有两类:一类是相等比较“==”与不相等比较“!=”;另一类是全等比较“===”与不全等比较“!==”。全等比较运算并非是ECMAScript语言所独有的,许多编程语言中都有类似的运算符,例如Swift。
在进行相等或不相等比较时,不同类型间数据的比较遵守如下几条原则:
(1)布尔值在比较运算前会被转换成数值,true转换成1,false转换成0。
(2)描述数字的字符串与数字进行比较前会被转换成数字。
(3)对象和字符串进行比较前,会将对象转换成字符串”[object Object]"。
(4)null值和undefined值进行相等比较,结果为true。
示例代码如下:

需要注意,如果进行比较操作的是引用值而非原始值,则比较的实际是所引用对象的地址。
再次提醒,NaN与NaN进行相等比较,结果是false。
“==”与“!=”运算在进行比较前,会根据上面的规则对操作数进行类型的转换,全等运算符“===”与不全等运算符“!==”在比较前不会做任何类型转换,换句话说,全等和不全等进行比较时,既会比较类型,又会比较值,只有类型和值完全相等的两个操作数才被认为是全等。示例如下:

有一个很有趣的小例子,在JavaScript中,如果下面的代码输出false:
console.log(ex>1);
那么如下代码将一定输出true么?
console.log(ex<=1);
答案是否定的,如果ex变量在进行比较转换时被转换成了NaN,那么上面两句输出的都将是false:
