JS字符串竟然可以比大小?
大家好,我是楊成功。
最近在籌備面試,又開始被動(dòng)刷編程題和算法題了。
昨天在做一個(gè)字符串變形的題目時(shí),我發(fā)現(xiàn)英文字母竟然可以比大小!!比如這樣:
'a' > 'b' // false
'a' < 'b' // true
'a' < 'B' // false
這是什么鬼?好奇心來了,我要搞懂它。
字符串比較的原理
通常情況下,數(shù)字比大小,就是按照數(shù)學(xué)中的值比較大小,沒有疑問。
而在 JavaScript 中,字符串比較是基于字符的 Unicode 值來進(jìn)行的。
我查了 26 個(gè)英文字母的 Unicode 碼(大小寫不同),發(fā)現(xiàn)它們的 Unicode 碼是連續(xù)的,結(jié)果如下:
- a~z:從 97 (a) 到 122 (z)。
- A~Z:從 65 (A) 到 90 (Z)。
從上面的結(jié)果看,我們可以得出兩個(gè)結(jié)論:
- 任意大寫字母的 Unicode 碼都比小寫字母的更小。
- a-z 或 A-Z,Unicode 碼不斷遞增。
現(xiàn)在再看文章前面的比較題,就可以清晰的看到比較結(jié)果:
- 'a' < 'b' 返回 true (因?yàn)?97 < 98)
- 'a' < 'B' 返回 false (因?yàn)?97 不小于 66)
多字符如何比較?
當(dāng)比較多字符的字符串時(shí),JavaScript 會從左向右逐字符比較,直到找到不同的字符或到達(dá)一個(gè)字符串的末尾。
比如,要比較 'cbaa' 和 'cazz' 這兩個(gè)字符串的大小,過程如下。
第一步:比較第一個(gè)字母的大小,即比較 c 和 c,結(jié)果相等,進(jìn)入下一步。
第二步:比較第二個(gè)字母的大小,即比較 b 和 a,此時(shí) b > a,停止比較。
因?yàn)?b > a,所以 cbaa > cazz,比較結(jié)束。
注意:如果你需要確保大小寫不會影響比較結(jié)果,可以將字符串轉(zhuǎn)換成統(tǒng)一的大小寫形式再進(jìn)行比較。
方法是使用 .toLowerCase() 或 .toUpperCase()。
可以做什么
基于以上特性,我們可以判斷某個(gè)字母的大小寫。
// 假設(shè)變量 n 是一個(gè)隨機(jī)字母
if(n >= 97 && n <= 122) {
console.log('小寫字母')
}
if(n >= 65 && n <= 90) {
console.log('大寫字母')
}
在字符串變形題目中,需要將大寫字母變?yōu)樾懀懽帜缸優(yōu)榇髮懀敲淳涂梢允褂蒙厦娴姆椒ㄅ袛啵⑶肄D(zhuǎn)換大小寫的。
當(dāng)然,更簡單的方法是直接使用轉(zhuǎn)換函數(shù),比如:
if(n == n.toLowerCase()) {
// 小寫,需要轉(zhuǎn)換為大寫
n = n.toUpperCase()
}
if(n == n.toUpperCase()) {
// 大寫,需要轉(zhuǎn)換為小寫
n = n.toLowerCase()
}
記住這個(gè)比較規(guī)則,下次遇到字符串比較的情況,別懵了。