逻辑 && 和 || 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也有很好的解释。
我想进一步澄清一些事情。
考虑一下:
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也有很好的解释。