比较运算符有以下几个
- 小于 <
- 大于 >
- 小于等于 <=
- 大于等于 >=
- 等于 ==
- 不等于 !=
- 严格等于 ===
- 严格不等于 !==
很显然,不管是哪个运算符,返回的结果都只有两种情况,比如 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 值 | 控制字符 |
|---|---|---|---|---|---|---|---|
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | \ | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
根据 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