JavaScript条件语句中的单竖线“|”

3

不知道有没有人遇到过这个问题。

我在一个项目中(这个项目是从另一个开发者手中接手的)发现了一个条件语句,大概长这样:

if (variableOne == true | variable2 == true) {
    // Do something here
}

没有出现错误,看起来是有效的。但是我和同事从未见过只用单个竖杠|的OR语句,通常都使用两个竖杠||

有人能解开这个谜团吗?

谢谢, 詹姆斯


2
这不是或语句,而是位运算。 - Gauthier
4个回答

17

这是一个位或运算符。它首先将其转换为32位整数,然后对产生的两个数字应用位或运算。在这种情况下,由于 Boolean(1) 是 true 并且 Number(true) 是 1,因此它可以正常地工作而没有问题(== 运算符始终会返回布尔值,并且 if 语句会将任何东西转换为布尔值)。以下是一些它的工作原理的例子:

1 | 0; // 1
0 | 0; // 0
0 | 1; // 1
1 | 1; // 1
true | false; // 1
false | false; // 0
2 | 1; // 3 (00000010, 00000001) -> (00000011)

由于双方都必须被转换成数字(并因此进行评估),因此在使用逻辑OR语句(||)时,当要使用数字时可能会导致意外的结果。举个例子:

var a = 1;
a | (a = 0);
console.log(a); // 0

var b = 1;
b || (b = 0);
console.log(b); // 1

// I wanted the first one
var c = 3 | 4; // oops, 7!

参考文献:http://www.ecma-international.org/ecma-262/5.1/#sec-11.10


2

2
两条竖线语法“||”表示它会短路逻辑表达式,只计算需要的部分直到得出结果。这是什么意思?
if(a==null || a.type=='ok')

如果a为null,则仅评估表达式的第一部分,在javascript方面不会出现错误。
if(a==null | a.type=='ok')

如果在这种情况下a为null,你将会遇到错误,因为它也会计算表达式的第二部分。
在其他C类型语言中也是同样的情况:Java、C、C++,对于"&"和"&&"也适用。

1
澳洲航空公司所说的也是对的,它是一个位运算符。它的行为如我所述,因为使用布尔表达式时,如果为真则返回1,如果为假则返回0。 - digao_mb

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接