不知道有没有人遇到过这个问题。
我在一个项目中(这个项目是从另一个开发者手中接手的)发现了一个条件语句,大概长这样:
if (variableOne == true | variable2 == true) {
// Do something here
}
没有出现错误,看起来是有效的。但是我和同事从未见过只用单个竖杠|
的OR语句,通常都使用两个竖杠||
。
有人能解开这个谜团吗?
谢谢, 詹姆斯
不知道有没有人遇到过这个问题。
我在一个项目中(这个项目是从另一个开发者手中接手的)发现了一个条件语句,大概长这样:
if (variableOne == true | variable2 == true) {
// Do something here
}
没有出现错误,看起来是有效的。但是我和同事从未见过只用单个竖杠|
的OR语句,通常都使用两个竖杠||
。
有人能解开这个谜团吗?
谢谢, 詹姆斯
这是一个位或运算符。它首先将其转换为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
if(a==null || a.type=='ok')
if(a==null | a.type=='ok')
|
是按位或运算符,在某些非常有限的情况下可以替代 ||
。
一个重要的区别是使用 |
时会对两个操作数进行评估,而使用 ||
时仅在第一个操作数为 false 时才会评估第二个操作数。
来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators