逻辑 && 和 || JavaScript 中的运算符

The logical && and || operators in JavaScript

我想进一步澄清一些事情。

考虑一下:

var a = 42;
var b = "abc";
var c = null;

a || b;     // 42 
a && b;     // "abc"
c || b;     // "abc" 
c && b;     // null 

我知道对于 || 运算符,如果对第一个操作数的测试为真,则 || 表达式会得出第一个操作数(a 或 c)的值。如果测试为假,则 || 表达式会产生第二个操作数 (b) 的值。

相反,对于 && 运算符,如果测试为真,则 && 表达式会产生第二个操作数 (b) 的值。如果测试为假,则 && 表达式的结果为第一个操作数(a 或 c)

的值

那么,当您使用 &&|| 运算符以及链接值时,到底发生了什么:

if(a && b && c && d && e){
    //do something;
}

if(a || b || c || d || e){
    //do something
}

链接这些值时究竟发生了什么?因为在第一个示例中(涉及 && 运算符)如果 a 为真,那么应该返回 b 对吗?那么在这一点上甚至考虑了 c 或 d 吗?

What exactly is taking place when you chain the values?

在第一个表达式 (&&) 中,所有值都必须为真,条件测试才能通过。假设所有值都是真实的,解释器将评估所有值并且条件测试将通过。否则它会评估第一个假值并且条件测试会失败。

在第二个表达式 (||) 中,只有一个值必须为真才能通过条件测试。假设至少有一个值是真值,解释器将评估第一个真值并且条件测试将通过。否则它将评估所有值并且条件测试将失败。

So what exactly is happening when you use the && and || operators with chaining values

&& 是一个二元运算符,有一个左手操作数和一个右手操作数。表达式 a && b && c && d && e 基于 associativity rules 进行解析,因此它看起来像这样:

if (a && (b && (c && (d && e)))) {

基于&&的语义,如果a为假,整个条件立即计算为a,这是假的。如果 a 为真,则表达式求值为右侧,即 b && (c && (d && e)))。在这种情况下,如果 b 为假,则该子表达式以及整个表达式的计算结果立即为 b,这是假的;如果 b 为真,则该子表达式求值到其右侧,即 c && (d && e),然后该过程继续。

最终结果是整个表达式为假的直觉行为,因此对于 if 分支,它满足 any 的变量是假的。一旦遇到任何虚假变量,评估将 "short-circuit"--导致虚假--。要使整个表达式为真,并因此要采用 if 分支,所有变量都必须为真。

对于||,逻辑是相反的。要使整个表达式为真,并因此要采用 if 分支,任何变量都为真就足够了。一旦遇到第一个真值,评估将 "short-circuit"——结果为真值。要使整个表达式为假,并因此要采用 if 分支 not,所有变量都必须为假。

You Don't Know JS也有很好的解释。