使用+和|之间的区别 JavaScript中的运算符?

Abi*_*ash 1 javascript performance operators

我正在研究AngularJS框架.我发现他们正在使用|运算符来添加内容.使用+运营商和|运营商时有什么区别?

它与性能有关吗?如果是这样的话?

这是被请求的代码: -

var manualLowercase = function(s) {
    return isString(s)
        ? s.replace(/[A-Z]/g, function(ch) {
            return String.fromCharCode(ch.charCodeAt(0) | 32);
    }): s;
};
Run Code Online (Sandbox Code Playgroud)

小智 5

他们是不同的运营商.

其中xy是数字2,x | y是一个逐位或x + y是加法.对于一些的价值观xy他们有同样的结果-为一切,结果会有所不同3.

无论如何,使用意味着什么的形式1.除非有性能案例,否则不要担心性能 - jsperf是一个方便的工具.然后意识到微基准和固有的偏见,它通常无关紧要.


1对于此特定问题,请注意正则表达式与每个AZ字符匹配,并将其替换为函数的结果.

因此我们知道这charCodeAt(0)是A..Z的字符代码.查看字符表,我们可以看到这些值在[0x41,0x5a]范围内,并注意[0x61,0x7a]是相应的小写字母.因此,我们可以通过在大写字母的字符代码中添加0x20(或32)来{A,B ... Z} - > {a,b ... z}.

还可以观察到,将32(或1 << 5)加到没有第5位设置的数字(例如[0x41,0x5a]范围内的数字)可以通过逐位或1 << 5来实现(即x | 32).这就是为什么|+可以互换位置.添加32(即x + 0x20)可以说更清楚,即使两个运算符在上述规则下都会表现相同.

在任何情况下,如果对这两种方法的性能影响感到好奇,那么在相关/目标环境中对代码进行整体(以及上下文)的基准测试.


2,操作者x | y总是逐位或(通过[ToInt]转换),但x + y 可以是一个字符串连接.

3 只有当 数字(或者更确切地说,既不是字符串),可转换为,没有共同的设置位,并且在大约[0,2 ^ 32]左右的范围内x,结果将是相同的.y[ToInt]