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
他们是不同的运营商.
其中x
和y
是数字2,x | y
是一个逐位或和x + y
是加法.对于一些的价值观x
和y
他们有同样的结果-为一切,结果会有所不同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]