1

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

跟性能有关系吗?如果有怎么办?

这是要求的代码:-

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

4 回答 4

5

他们是不同的运营商。

where xand yare numbers 2 ,x | y是按位 orx + 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仅当 xy都是数字(或者更确切地说,两者都不是字符串),可以通过 转换[ToInt]没有共同的设置位,并且在大约 [0, 2^32) 左右的范围内时,结果才会相同.

于 2013-03-09T05:48:21.243 回答
4

+是加法运算符,|是位运算符。但是因为您说“这与性能有关吗?” 所以我认为你的方法在以下两个之间更好:

x = 0 | '5';

或者

x = + '5';

根据算术运算符的 MDN 页面:

一元加法是将某物转换为数字的最快和首选方法

此外,请在此处阅读对我的回答的评论,某些浏览器的性能会更好|

另请阅读wiki:按位运算

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

这是一个有趣的链接'jsperf'

于 2013-03-09T05:49:59.447 回答
1

我刚开始学习javascript。到目前为止,我听说过用于添加两个字符串值或两个值的“+”运算符。如果您添加一个数字和字符串,那么它将仅提供字符串结果。如果你提供两个数字,那么我给出两个数字相加的结果。

于 2013-03-09T06:13:46.720 回答
-1

在二进制变量中操作时,我们可以使用or(|)代替plus(+)运算符。它将给出相同的结果。您可能想了解二进制算术。只是谷歌,你会偶然发现可能很好的搜索。

于 2013-03-09T05:56:16.087 回答