【问题标题】:Boolean operators which return one of the operands返回操作数之一的布尔运算符
【发布时间】:2011-03-14 17:10:28
【问题描述】:

在 Python 中,也许在 Javascript 中,布尔值 orand 运算符返回操作数之一,而不是 truefalse

  • 在 Python 中,返回操作数之一:'' || 'hello' == 'hello'
  • 相比之下,在 PHP 中:'' || 'hello' == true;

现在,

  • 如何调用布尔运算符的这种行为?
  • 这是否也适用于所有浏览器的 Javascript?

【问题讨论】:

    标签: javascript operators boolean


    【解决方案1】:

    recent question 已重定向至此处,尽管我同意中心问题已在高层次上得到准确回答,但部分较新问题似乎是在询问逻辑 OR 和三元运算符之间的区别在 Javascript 中。

    我想提供一个低级示例来说明差异,因为我在重定向问题之前编写了大部分内容,null-coalescing operator 的概念相当抽象。

    考虑这些函数,它们可以在浏览器控制台或任何 repl 中运行:

    let logicalOrTest = function(val) { 
      let a = 2;
      let b = 3;
      console.log(val === a);
      console.log(val === b);
      console.log(val === (a || b));
      console.log(val !== (a || b));
    }
    
    

    期待logicalOrTest(2) 登录true false true false

    期待logicalOrTest(3) 登录false true false true

    期待logicalOrTest(4) 登录false false false true

    这表明,当值等于第一个条件时,将任何值 val(a || b) 进行比较将返回 true,而对于任何其他值,将返回 false包括第二个.

    简单地说,如果满足a 条件,则甚至不考虑条件b。另一方面,如果条件a 不满足,b 将在决定做什么之前考虑

    现在让我们看看三元运算符:

    let ternaryTest = function(val) { 
      let a = 2;
      let b = 3;
      val === a ? console.log(true) : console.log(false);
      val === b ? console.log(true) : console.log(false);
      val === (a || b) ? console.log(true) : console.log(false);
      val !== (a || b) ? console.log('neither condition was met') : console.log('wat');
    }
    
    

    期望ternaryTest(2) 登录true false true "wat"

    期待ternaryTest(3) 登录false true false "neither condition was met"

    期待ternaryTest(4) 登录false false false "neither condition was met"

    与逻辑 OR (||) 一样,三元运算符 x ? x : y 会将任何 falsy 值传递到第二个表达式的范围内,其中还包括与第二个条件等效的值。如果满足条件a,则不考虑条件b

    区别在于,如果条件a在三元运算中满足,则表达式a将被忽略,而表达式b总是被执行。

    因此,虽然它们可以用于类似目的,但了解哪一个更有效非常重要——尤其是当您在操作范围内触发大块代码时。

    【讨论】:

      【解决方案2】:

      正如Ignacio's answer 指出的那样,这些是合并 运算符。 ||null coalescing operator&& 是空安全合并运算符(链接,如果我能找到一个抱歉,我找不到链接)。

      它们应该在所有浏览器中都可用——它们都在 ECMA-262 第 1、2、3 和第 5 版中定义,大多数当前的 Javascript 实现基于第 3 或第 5 版。来自 ECMA-262 第 3 版:

      产生式 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression 被评估为 如下:
      1. 计算逻辑与表达式。
      2. 调用GetValue(Result(1))。
      3. 调用 ToBoolean(Result(2)).
      4. 如果 Result(3) 为 false,则返回 Result(2)。
      5. 计算 BitwiseORExpression。
      6. 调用 GetValue(Result(5))。
      7. 返回结果(6)。

      产生LogicalORExpression:LogicalORExpression || LogicalANDExpression 被评估为 如下:
      1. 计算逻辑或表达式。
      2. 调用GetValue(Result(1))。
      3. 调用 ToBoolean(Result(2)).
      4.如果Result(3)为真,返回Result(2)。
      5. 计算逻辑与表达式。
      6. 调用 GetValue(Result(5))。
      7. 返回结果(6)。

      【讨论】:

      • 可能值得指出的是,虽然|| 是 JavaScript 最接近空合并运算符(不包括提案),但它可能更恰当地称为 falsy 合并运算符。 (我意识到我在 9 年后对此发表评论,但它今天被引用为 this question 的副本。)
      【解决方案3】:

      这称为“合并”。它在任何声称兼容的浏览器中的行为都应该相同。

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2012-12-06
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 2015-01-07
        相关资源
        最近更新 更多