带有单个管道的Javascript条件语句“|&”;

Javascript conditional statement with a single pipe "|"

本文关键字:语句 条件 单个 管道 Javascript      更新时间:2023-09-26

只是想知道以前是否有人遇到过这种情况。

我在一个项目(从另一个开发人员那里移交的)中发现了一个条件语句,看起来像这样:

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

它没有出错,所以似乎有效。但是,我和一位同事从未见过一个OR语句带有一个管道|,只有2个||

有人能揭开这个谜吗?

谢谢,James

这是一个按位OR运算符。它将首先将其转换为32位整数,然后对产生的两个数字应用逐位OR运算。在这种情况下,由于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

这是位OR,请参阅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++同样的道理也适用于"&amp和'&'

|是一个逐位OR,在一些非常有限的情况下,它可以替代||

一个重要的区别是,|计算两个操作数,而||仅在第一个操作数为false时才计算第二个操作数。

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators