手动大写/小写说明

时间:2014-08-05 23:27:07

标签: javascript

我在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;
};

2 个答案:

答案 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);
}

该功能的工作原理如下:

  1. 获取ch的字符代码ch.charCodeAt(0)。见charCodeAt documentation
  2. ~32-33。见bitwise NOT operator
  3. 它会使用这些数字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

  4. 使用String.fromCharCode,它会将上面的代码转换为相应的字符

  5. 返回该字符