【问题标题】:The logical && and || operators in JavaScript逻辑 && 和 || JavaScript 中的运算符
【发布时间】:2017-05-03 11:21:09
【问题描述】:

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

考虑一下:

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吗?

【问题讨论】:

  • 在第一个表达式中,c、d 和 e 绝对不会被忽略(除非 a 或 b 为假并且表达式短路)。在 && 链中,返回值将是第一个 false 表达式,或者如果所有表达式都为真,则返回值将是最终表达式。当您实际上没有将结果分配给某物时,您通常不必担心返回或不返回哪个 - 如果 a,b,则执行第一个表达式。 C。 d。和 e 都为真,只要至少有一个为真,就执行第二个表达式。
  • 感谢您提供实际有用的回复!
  • 如果对第一个操作数的测试为真不,表示如果是,与“真”不同。跨度>

标签: javascript logical-operators


【解决方案1】:

那么,当您将 &&|| 运算符与链接值一起使用时,究竟发生了什么

&& 是一个二元运算符,有一个左操作数和一个右操作数。表达式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 就足够了的变量是虚假的。一旦遇到任何虚假变量,评估将“短路”——导致虚假变量。要使整个表达式为真,因此要采用if 分支,所有变量都必须为真。

对于||,逻辑相反。要使整个表达式为真,因此要采用if 分支,只要任何变量为真就足够了。一旦遇到第一个真值,评估就会“短路”——导致真值。要使整个表达式为假,因此要采用 if 分支 not,所有变量都必须是假的。

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

【讨论】:

  • "不,只有当所有值都为真时,解释器才必须评估所有值。否则,它将在第一个假值处短路。"重要的澄清细节,谢谢。已更新我的答案以将其考虑在内。
【解决方案2】:

链接这些值时究竟发生了什么?

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

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多