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

时间:2013-03-09 05:45:23

标签: 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;
};

4 个答案:

答案 0 :(得分:5)

他们是不同的运营商。

xy为数字 2 x | ybit-wise orx + y为加法。对于 xy的某些值,它们将具有相同的结果 - 对于其他所有内容,结果将是不同的 3

无论如何,使用意味着什么 1 的形式。除非有性能案例,否则不要担心性能 - jsperf是一个方便的工具。然后意识到微基准并且固有地偏向于它usually doesn't matter


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

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

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

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


2 运算符x | y 总是按位或(通过[ToInt]转换),但x + y 可能是字符串连接。

3 仅当 xy都是数字(或者更确切地说,两者都不是字符串)时,结果将是相同的,可以通过[ToInt]转换,有 no 设置共同位,并且大约在[0,2 ^ 32]范围内。

答案 1 :(得分:4)

+是加法运算符,|是按位运算符。但是因为你说“它与性能有关吗?” 所以我认为你的手段在两者之间更好:

x = 0 | '5';

x = + '5';

根据MDN page on Arithmetic Operators:

  

一元加号是将某些东西转换为数字的最快和首选方式

另外,阅读评论my answer here某些浏览器的效果会更好|

另请阅读wiki: Bitwise operation

  

在简单的低成本处理器上,通常,按位运算比分割快得多,比乘法快几倍,有时比加法快得多

以下是interesting link 'jsperf'

答案 2 :(得分:1)

我刚开始学习javascript。直到现在我听说“+”运算符用于添加两个字符串值或两个值。如果添加数字和字符串,则仅提供字符串结果。如果你提供两个数字,那么我给出两个数字加法的结果。

答案 3 :(得分:-1)

在二进制变量中操作时,我们可以使用或(|)而不是加(+)运算符。它会给出相同的结果。您可能想知道二进制算术。只是谷歌,你会偶然发现好搜索。