Javascript:|之间有什么区别和||?

时间:2011-02-17 01:19:30

标签: javascript

我正在查看一些Javascript代码:

if ( a>2 | b>4 ) { ... }

(忽略上面的......)。什么是|在做什么?我认为这是合乎逻辑的OR,但是我在网上找到的所有参考资料都是关于||的,我找不到任何只提及的东西。提前致谢

4 个答案:

答案 0 :(得分:4)

这是按位或。 ||符合逻辑或。

按位或(|)将值强制为32位整数并返回32位整数,如果相应位置中的两位中的任何一位为1则返回1,如果它们都是0则返回0 0

逻辑或(||)计算第一个值,如果它不是假的,否则计算为第二个值。

您几乎肯定希望||代替|

答案 1 :(得分:3)

其他答案中已经解释了|||之间的差异。

但是,在上面的代码中,由于类型转换,|||具有相同的效果。

truefalse已映射到10,我们有

0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1

同样进入另一个方向,1评估为true0评估为false

所以在这个例子中,

if ( a>2 | b>4 )

将与

具有相同的结果
if ( a>2 || b>4 )

注意:这实际上只适用于01两个值。


这可能是某种微优化。

<强>更新

然而,一个简短的测试表明,为此目的使用按位OR是慢一点(至少在Chrome 9中):

http://jsperf.com/js-or-test

结论:不要使用它而不是逻辑OR :)很可能有人忘记了第二个|,并且很幸运,代码会产生相同的结果。

使用布尔运算符进行布尔运算,使用按位运算符进行奇特的位掩码。这可能值得一读:MDC - Bitwise Operators

答案 2 :(得分:2)

单身|是按位OR,而double(||)是逻辑OR。

Bitwise-OR采用两个源值的二进制表示并将它们组合在一起,这样如果其中一个值设置了一个位,则结果值的位也将被置位(对两个源值中的所有位重复) )。

Logical-OR关注真值和假值(其中0映射到false和非零映射为true - 这是简化的,JavaScript具有更具体的规则)。如果任一源值为true,则结果为true。

答案 3 :(得分:0)

看起来第二个管道刚丢失,否则它是一个臭臭的黑客。看看到底发生了什么:

if ( Boolean( Number(a>2) | Number(b>4) ) ) { ... }

Number在这里很特别,因为按位运算符正在使用32位整数)  它起作用,因为数字(真)=== 1&amp;&amp;数字(假)=== 0。