我正在查看一些Javascript代码:
if ( a>2 | b>4 ) { ... }
(忽略上面的......)。什么是|在做什么?我认为这是合乎逻辑的OR,但是我在网上找到的所有参考资料都是关于||的,我找不到任何只提及的东西。提前致谢
答案 0 :(得分:4)
这是按位或。 ||
符合逻辑或。
按位或(|
)将值强制为32位整数并返回32位整数,如果相应位置中的两位中的任何一位为1则返回1,如果它们都是0则返回0 0
逻辑或(||
)计算第一个值,如果它不是假的,否则计算为第二个值。
您几乎肯定希望||
代替|
。
答案 1 :(得分:3)
其他答案中已经解释了||
和|
之间的差异。
但是,在上面的代码中,由于类型转换,|
与||
具有相同的效果。
true
和false
已映射到1
和0
,我们有
0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1
同样进入另一个方向,1
评估为true
,0
评估为false
。
所以在这个例子中,
if ( a>2 | b>4 )
将与
具有相同的结果if ( a>2 || b>4 )
注意:这实际上只适用于0
和1
两个值。
这可能是某种微优化。
<强>更新强>
然而,一个简短的测试表明,为此目的使用按位OR是慢一点(至少在Chrome 9中):
结论:不要使用它而不是逻辑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。