大家好,我是杨成功。
最近在筹备面试,又开始被动刷编程题和算法题了。
昨天在做一个字符串变形的题目时,我发现英文字母竟然可以比大小!!比如这样:
'a' > 'b' // false
'a' < 'b' // true
'a' < 'B' // false
这是什么鬼?好奇心来了,我要搞懂它。
字符串比较的原理
通常情况下,数字比大小,就是按照数学中的值比较大小,没有疑问。
而在 JavaScript 中,字符串比较是基于字符的 Unicode 值来进行的。
我查了 26 个英文字母的 Unicode 码(大小写不同),发现它们的 Unicode 码是连续的,结果如下:
- a~z:从 97 (a) 到 122 (z)。
- A~Z:从 65 (A) 到 90 (Z)。
从上面的结果看,我们可以得出两个结论:
- 任意大写字母的 Unicode 码都比小写字母的更小。
- a-z 或 A-Z,Unicode 码不断递增。
现在再看文章前面的比较题,就可以清晰的看到比较结果:
- 'a' < 'b' 返回 true (因为 97 < 98)
- 'a' < 'B' 返回 false (因为 97 不小于 66)
多字符如何比较?
当比较多字符的字符串时,JavaScript 会从左向右逐字符比较,直到找到不同的字符或到达一个字符串的末尾。
比如,要比较 'cbaa' 和 'cazz' 这两个字符串的大小,过程如下。
比较第一个字母的大小,即比较 c 和 c,结果相等,进入下一步。
比较第二个字母的大小,即比较 b 和 a,此时 b > a,停止比较。
因为 b > a,所以 cbaa > cazz,比较结束。
注意:如果你需要确保大小写不会影响比较结果,可以将字符串转换成统一的大小写形式再进行比较。
方法是使用 .toLowerCase() 或 .toUpperCase()。
可以做什么
基于以上特性,我们可以判断某个字母的大小写。
// 假设变量 n 是一个随机字母
if(n >= 97 && n <= 122) {
console.log('小写字母')
}
if(n >= 65 && n <= 90) {
console.log('大写字母')
}
在字符串变形题目中,需要将大写字母变为小写,小写字母变为大写,那么就可以使用上面的方法判断,并且转换大小写的。
当然,更简单的方法是直接使用转换函数,比如:
if(n == n.toLowerCase()) {
// 小写,需要转换为大写
n = n.toUpperCase()
}
if(n == n.toUpperCase()) {
// 大写,需要转换为小写
n = n.toLowerCase()
}
记住这个比较规则,下次遇到字符串比较的情况,别懵了。