JavaScript sameCase函数为何可识别数字、空白符等非字母字符?
问题说明
需求是校验两个字符的大小写是否一致,在查阅实现时看到如下版本的代码,无法理解其运行逻辑:
function sameCase(a, b){ if(a.toUpperCase() === a.toLowerCase() || b.toLowerCase() === b.toUpperCase()){ return -1 }else if(a === a.toLowerCase() && b === b.toLowerCase() || a === a.toUpperCase() && b === b.toUpperCase()){ return 1 }else{ return 0 } }
其中最无法理解的是首个if判断的逻辑:
if(a.toUpperCase() === a.toLowerCase() || b.toLowerCase() === b.toUpperCase()){ return -1}
实际测试发现这段判断可以正确识别数字、空白字符等非字母内容,但代码里没有针对这类字符做任何专门的匹配处理,核心疑问是:为什么这个函数可以正确处理非字母字符、数字甚至空白字符?
逻辑原理
这个判断能生效的核心原因,是JavaScript字符串自带的toUpperCase()、toLowerCase()方法的固有特性:
- 对有大小写区分的英文字母来说,转大写和转小写的结果必然不同:比如小写
a转大写得到A,和小写结果a不相等;大写B转小写得到b,和大写结果B不相等。 - 对没有大小写概念的字符来说,不管是数字、空白符、标点、特殊符号还是非拉丁文字符,调用这两个方法都会直接返回字符本身,转大写和转小写的结果完全一致。
你可以自己跑几个测试用例验证这个特性:
- 数字
'3':'3'.toUpperCase() === '3','3'.toLowerCase() === '3',二者相等 - 空格
' ':转大写、转小写结果都是空格,二者相等 - 特殊符号
'@':转大小写结果都不变,二者相等 - 小写字母
'x':转大写是'X',转小写是'x',二者不相等 - 大写字母
'M':转大写是'M',转小写是'm',二者不相等
顺着这个特性再看整个函数的逻辑就非常清晰了:
- 第一个分支:只要a、b任意一个字符不存在大小写区分(也就是不是英文字母),直接返回
-1,代表输入不属于可比较大小写的合法范畴 - 第二个分支:走到这里说明两个字符都是英文字母,此时判断「两个都是小写」或者「两个都是大写」,满足则返回
1,代表二者大小写一致 - 剩余分支:两个字符一个是大写一个是小写,返回
0,代表二者大小写不一致
内容的提问来源于stack exchange,提问作者HighKingKwami
相关产品推荐
相关产品推荐

