【问题标题】:Why does JavaScript && operator return the second expression? [duplicate]为什么 JavaScript && 运算符返回第二个表达式? [复制]
【发布时间】:2016-02-03 14:02:10
【问题描述】:

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

expr1 || expr2 对我来说很有意义。它将表达式短路并返回第一个,这是有道理的。我经常使用它来选择传递的变量与默认变量。例如。

var default_connection = 'localhost:27017/task_master';

function setdb(connection){
    var conn_str = connection || default_connection;
    //Do something here
}

&& 的行为让我很吃惊,对我来说似乎非常难以理解。

expr1 && expr2 - 如果可以转换为 false,则返回 expr1;否则,返回expr2

谁能帮我理解这一点,并提出一些&& 可能有用的用例。

编辑:从建议的原始问题中找到它。这给了我使用它的充分理由。

&& 有时被称为守卫操作符。

变量 = 指标 && 值

只有在指标为真时才能设置值。

我的问题是,“有人可以帮助我理解这一点并提出一些&& 可能有用的用例吗?”。我不知道这个问题的哪一部分难以理解。我举了一个我如何找到的例子||有用,上面的原因给出了一个足够好的理由 && 如何也有用。是的,我是 JavaScript 新手,是的,我没有你们那么聪明。但是有点善良会帮助我到达那里。和平!

【问题讨论】:

  • 代码&&在哪里看到?
  • @David Haim:代码属于||。他一般都在问&&。请注意,他甚至询问了 && 的用例 - 显然,他不知道任何用例。
  • "为什么 JavaScript && 运算符返回第二个表达式?"因为,作为一个逻辑与,为了使第二个表达式甚至被认为是第一个表达式必须是真实的,否则它会短路。真的和怎么没区别||有效 - 当 expr1 为假时,它会返回 expr2,就像 && 当 expr1 为真时一样。
  • 那句话的哪一部分你不明白?对我来说似乎很清楚

标签: javascript


【解决方案1】:

短路性质是次要的,不太重要 - 首先|| 代表逻辑or,而&& 代表逻辑and

由于两者本质上都是惰性的,它们可以在结果被清除后停止评估,这就是次要行为的来源。当or 的第一个值为真时,不需要评估第二个。当and 的第一个值为false 时,不需要评估第二个。

【讨论】:

    【解决方案2】:

    让我们看看a && b 对于ab 的所有值的可能结果。

    如果a = falseb = false 那么 a && b = false 等于 a
    如果a = falseb = true 那么 a && b = false 等于 a
    如果a = trueb = false 那么 a && b = false 等于 b
    如果a = trueb = true 那么 a && b = true 等于 b

    所以当afalse 时,表达式a && b 将返回false。所以如果afalse我们只需要返回它。

    atrue 时,表达式a && b 将仅取决于b 的值,即true 如果b = truefalse 如果b = false。 这意味着在atrue 时,我们只需返回b 的值

    【讨论】:

      【解决方案3】:

      它停在一个假值并返回最后一个值(我认为这样更清楚)。这对嵌套对象非常有帮助。假设您可能有这样的对象,但 prop 或 nestedProp 可能不存在:

      var a = {
         prop : {
           nestedProp : {
              hello : 'hello'
           }
         }
      }
      

      现在,如果我们需要检查 nestedProp 中的字符串怎么办

      你不能说:

      if(a.prop.nestedProp.hello === 'hello')
      

      因为propnestedProp 可能未定义,如果您尝试执行此检查,您将获得TypeError

      所以你这样做:

      if(a.prop &&.prop.nestedProp && a.prop.nestedProp.hello === 'hello')
      

      尝试分配 hello 属性是一样的:

      var hello = a.prop && a.prop.nestedProp && a.prop.nestedProp.hello;
      

      如果a.prop 未定义,它将停在那里并返回未定义。如果它是一个真值,那么它将评估a.prop.nestedProp,如果它是一个假值,那么它将返回,否则它返回a.prop.nestedProp.hello

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 2019-09-28
        • 1970-01-01
        相关资源
        最近更新 更多