只是想知道是否有人以前遇到过这种情况。
我在一个项目(由另一个开发人员移交)中发现了一个看起来像这样的条件语句:
if (variableOne == true | variable2 == true) {
// Do something here
}
它没有错误,所以似乎工作。但是,我自己和一位同事从未见过带有单个管道的 OR 语句|
,只有 2 ||
。
谁能解开这个谜团?
谢谢,詹姆斯
只是想知道是否有人以前遇到过这种情况。
我在一个项目(由另一个开发人员移交)中发现了一个看起来像这样的条件语句:
if (variableOne == true | variable2 == true) {
// Do something here
}
它没有错误,所以似乎工作。但是,我自己和一位同事从未见过带有单个管道的 OR 语句|
,只有 2 ||
。
谁能解开这个谜团?
谢谢,詹姆斯
这是一个按位或运算符。它将首先将其转换为 32 位整数,然后将按位或运算应用于结果的两个数字。在这种情况下,因为Boolean(1)
为真且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
这是按位或,请参阅 Mozilla 的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators)
两个管道语法“||” 意味着它使逻辑表达式短路。只评估需要的,直到它知道结果。这是什么意思?
if(a==null || a.type=='ok')
如果 a 为 null,它将仅计算表达式的第一部分,而在 javascript 端没有错误。
if(a==null | a.type=='ok')
如果在这种情况下 a 为 null,则会出现错误,因为它也会计算表达式的第二部分。
其他 C 类型语言也是如此:Java、C、C++ 同样的事情也适用于 '&' 和 '&&'
|
是按位或,在某些非常有限的情况下可以替代||
.
一个重要的区别是,|
两个操作数都被计算,不像||
只有当第一个操作数为假时才会计算第二个操作数。
来源:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators