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

Posted

技术标签:

【中文标题】带有单管道“|”的 Javascript 条件语句【英文标题】:Javascript conditional statement with a single pipe "|" 【发布时间】:2013-09-06 20:16:42 【问题描述】:

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

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

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

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

谁能解开这个谜团?

谢谢, 詹姆斯

【问题讨论】:

它不是一个或语句,它是按位数学。 【参考方案1】:

这是一个按位或运算符。它将首先将其转换为 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

【讨论】:

【参考方案2】:

这是一个按位或,请参阅 Mozilla 的文档:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/Bitwise_Operators)

【讨论】:

【参考方案3】:

两个管道语法“||”意味着它使逻辑表达式短路。只评估需要的,直到它知道结果。 什么意思?

if(a==null || a.type=='ok')

如果 a 为 null,它将只计算表达式的第一部分,在 javascript 端没有错误。

if(a==null | a.type=='ok')

如果在这种情况下 a 为 null,则会出现错误,因为它也会计算表达式的第二部分。

其他 C 类型语言也是如此:Java、C、C++ 同样的事情也适用于 '&' 和 '&&'

【讨论】:

澳航说的也对,是位运算符。它的行为就像我说的那样,因为对于布尔表达式,如果它是真的,它将返回 1,如果它是假的,则返回 0。【参考方案4】:

| 是按位或,在某些非常有限的情况下可以替代||

一个重要的区别是| 对两个操作数都求值,这与|| 不同,后者仅在第一个操作数为假时才对第二个操作数求值。

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

【讨论】:

以上是关于带有单管道“|”的 Javascript 条件语句的主要内容,如果未能解决你的问题,请参考以下文章

带有&符号的javascript条件语句仅读取前半部分

如何使用带有select onchange的条件语句在javascript函数中返回html代码

“|”是啥意思(单管道)在 JavaScript 中做啥?

带有 ngSwitch 的条件按钮也带有来自异步管道数组的 ngFor

JS字符串运算符比较条件按语句

如何将带有管道符号的多个参数传递到bash脚本案例语句中