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