我在AngularJS源代码中找到了以下代码,并且不知道它是如何工作的:
"this is it.".replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
将输出THIS IS IT.
我特别不理解那部分ch.charCodeAt(0) & ~32
以及它是如何形成一个大写的字母。任何人都可以向我解释逻辑吗?
完整代码
var manualUppercase = function(s) {
return isString(s)
? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
: s;
};
答案 0 :(得分:3)
表达式~32
取值32并翻转每一位,得到如下的位模式:11011111
。
大写字母的ASCII值从值65开始,而小写字母的ASCII值从97开始。差异是第5位或32位。
因此,如果您预先形成按位AND,例如a
和~32
,则第5位将被清除,结果将为A
。
注意:这仅适用于ASCII字母字符。对于超出该范围的UTF-8,它会惨遭失败。
答案 1 :(得分:1)
正则表达式/[a-z]/
匹配 a 和 z 之间的每个小写字符。
然后,每个匹配作为参数ch
传递给以下函数,并由返回的字符串替换。
function(ch) {
return String.fromCharCode(ch.charCodeAt(0) & ~32);
}
该功能的工作原理如下:
ch
的字符代码ch.charCodeAt(0)
。见charCodeAt
documentation。~32
是-33
。见bitwise NOT operator。它会使用这些数字bitwise AND operation。
这是一个技巧,对于97( a 的字符代码)和122( z 的代码)之间的数字,将减去32给它们,给出代码大写字符。
例如:
Character | Code | Code & ~32 | New character
----------------------------------------------
a | 97 | 65 | A
b | 98 | 66 | B
c | 99 | 67 | C
您可以找到ASCII字符代码的完整列表here。
使用String.fromCharCode
,它会将上面的代码转换为相应的字符