【问题标题】:Why don't logical operators (&& and ||) always return a boolean result?为什么逻辑运算符(&& 和 ||)不总是返回布尔结果?
【发布时间】:2011-07-22 00:54:10
【问题描述】:

为什么这些逻辑运算符返回一个对象而不是布尔值?

var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );

var _ = obj && obj._;

我想了解为什么它返回 obj.fn()(如果已定义)或 obj._ 的结果而不是布尔结果。

【问题讨论】:

  • 我想他想知道为什么a || b 不返回布尔值而是ab
  • var _ = obj && obj._; 不返回布尔值吗? O.o / 那它返回什么?第一个评估为假 evt。如果一切都为真,最后一个真?
  • 盗贼大师,这正是我的意思。我更新了我的帖子
  • @theateist 这就是 &&|| 在 JavaScript 中的工作方式。它们返回参数而不是布尔值。 .... 你为什么问?因为 Brendan Eich 是这么说的!

标签: javascript logical-operators


【解决方案1】:

首先,它必须是真实的,所以如果你正在测试真实性,那么它没有任何区别

其次,它可以让你按照以下方式进行分配:

function bar(foo) {
    foo = foo || "default value";

【讨论】:

    【解决方案2】:
    var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false 
    

    将返回布尔值。

    更新

    请注意,这是基于我的测试。不能完全依赖我。

    这是一个分配truefalse值的表达式。相反,它分配计算值。

    让我们看看这个表达式。

    一个示例表达式:

    var a = 1 || 2;
    // a = 1
    
    // it's because a will take the value (which is not null) from left
    var a = 0 || 2;
    // so for this a=2; //its because the closest is 2 (which is not null)
    
    var a = 0 || 2 || 1;    //here also a = 2;
    

    你的表情:

    var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
    
    // _ = closest of the expression which is not null
    // in your case it must be (obj.fn && obj.fn())
    // so you are gettig this
    

    另一种表达方式:

    var a = 1 && 2;
    // a = 2
    
    var a = 1 && 2 && 3;
    // a = 3 //for && operator it will take the fartest value
    // as long as every expression is true
    
    var a = 0 && 2 && 3;
    // a = 0
    

    另一种表达方式:

    var _ = obj && obj._;
    
    // _ = obj._
    

    【讨论】:

    • experimentX,我更新了我的帖子。它返回 fnobj._ 的结果之一,但不是布尔值。
    • 你也可以使用 !!x 来强制 x 为布尔值
    • 或者简单地说 var _ = !!((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}));
    【解决方案3】:

    在 JavaScript 中,||&& 都是逻辑短路运算符,它们在从左到右求值时返回第一个完全确定的“逻辑值”。

    在表达式X || Y 中,首先计算X,并将其解释为布尔值。如果此布尔值为“true”,则返回它。并且 Y 没有被评估。 (因为不管Y是真还是Y是假,X || Y已经完全确定了。)那是短路部分。

    如果这个布尔值是“假”,那么我们仍然不知道X || Y 是真还是假,直到我们评估Y,并将其解释为布尔值。那么Y 就会被返回。

    && 也一样,只是它停止评估第一个参数是否为假。

    第一个棘手的部分是,当表达式被评估为“真”时,表达式本身就会被返回。这在逻辑表达式中算作“真”,但您也可以使用它。所以这就是您看到返回实际值的原因。

    第二个棘手的部分是,当一个表达式被评估为“false”时,在 JS 1.0 和 1.1 中,系统将返回一个布尔值“false”;而在 JS 1.2 中,它返回表达式的实际值。

    在 JS 中 false0-0""nullundefinedNaNdocument.all 都是 count as false

    这里我当然是为了讨论而引用逻辑值。当然,文字字符串"false" 与值false 不同,因此为真。

    【讨论】:

    • 没错,但没有回答问题。他问“为什么”。
    【解决方案4】:

    这里可以参考JS的spec(11.11):

    语义

    产生式 LogicalANDExpression :LogicalANDExpression &&BitwiseORExpression 的求值如下:

    1. 计算逻辑与表达式。

    2.调用GetValue(Result(1))。

    3.Call ToBoolean(Result(2)).

    4.如果Result(3)为假,返回Result(2)。

    5.评估 BitwiseORExpression。

    6.调用GetValue(Result(5))。

    7.返回结果(6)。

    请参阅here 了解规格

    【讨论】:

      【解决方案5】:

      比较:

      var prop;
      if (obj.value) {prop=obj.value;}
      else prop=0;
      

      与:

      var prop=obj.value||0;
      

      返回一个真实的表达式 - 而不仅仅是 true 或 false - 通常会使您的代码更短且仍然可读。这在 || 中很常见,而在 && 中则不然。

      【讨论】:

        【解决方案6】:

        我认为您在这里有基本的 JavaScript 方法问题。

        现在,JavaScript 是一种松散类型的语言。因此,它处理逻辑运算的方式和方式不同于其他标准语言,如 Java 和 C++。 JavaScript 使用称为“类型强制”的概念来确定逻辑操作的值,并始终返回第一个 true 类型的值。例如,看看下面的代码:

        var x = mystuff || document;
        // after execution of the line above, x = document
        

        这是因为mystuff 是一个先验 未定义的实体,在测试时总是会评估为false,因此,JavaScript 会跳过这个并测试下一个实体的true 值.由于文档对象是 JavaScript 已知的,因此它返回一个 true 值,而 JavaScript 返回此对象。

        如果您想要返回一个布尔值,您必须将逻辑条件语句传递给这样的函数:

        var condition1 = mystuff || document;
        
        function returnBool(cond){
          if(typeof(cond) != 'boolean'){ //the condition type will return 'object' in this case
             return new Boolean(cond).valueOf();
          }else{ return; }
        }    
        // Then we test...
        var condition2 = returnBool(condition1);
        window.console.log(typeof(condition2)); // outputs 'boolean' 
        

        【讨论】:

        • !!condition1 是从真假结果中获取布尔值 truefalse 的一种更简单的方法。
        【解决方案7】:

        用最简单的话来说:

        || 运算符返回第一个真值,如果没有一个真值,则返回最后一个值(这是一个假值)。

        && 运算符返回第一个假值,如果没有假值,则返回最后一个值(即真值)。

        真的就这么简单。在您的控制台中进行实验以亲自查看。

        console.log("" && "Dog");    // ""
        console.log("Cat" && "Dog"); // "Dog"
        console.log("" || "Dog");    // "Dog"
        console.log("Cat" || "Dog"); // "Cat"

        【讨论】:

        • 你的回答真的是最简单易懂的。谢谢。
        【解决方案8】:

        在大多数编程语言中,&&|| 运算符返回布尔值。 在 JavaScript 中则不同


        OR 运算符:

        返回验证为真的第一个操作数的值(如果有),否则返回最后一个操作数的值(即使它验证为假)

        示例 1:

        var a = 0 || 1 || 2 || 3;
                ^    ^    ^    ^
                f    t    t    t
                     ^
                     first operand that validates as true
                     so, a = 1
        

        示例 2:

        var a = 0 || false || null || '';
                ^    ^        ^       ^
                f    f        f       f
                                      ^
                                      no operand validates as true,
                                      so, a = ''
        

        AND 运算符:

        返回验证为真的最后一个操作数的值(如果所有条件都验证为真),否则返回第一个操作数的值验证为假

        示例 1:

        var a = 1 && 2 && 3 && 4;
                ^    ^    ^    ^
                t    t    t    t
                               ^
                               last operand that validates as true
                               so, a = 4
        

        示例 2:

        var a = 2 && '' && 3 && null;
                ^    ^     ^    ^
                t    f     t    f
                     ^
                     return first operand that validates as false,
                     so, a = ''
        

        结论:

        如果您希望 JavaScript 以与其他编程语言相同的方式运行,请使用 Boolean() 函数,如下所示:

        var a = Boolean(1 || 2 || 3);// a = true
        

        【讨论】:

          【解决方案9】:

          您应该将短路运算符视为条件而不是逻辑运算符。

          x || y大致对应:

          if ( x ) { return x; } else { return y; }  
          

          x && y大致对应:

          if ( x ) { return y; } else { return x; }  
          

          鉴于此,结果完全可以理解。


          来自MDN documentation

          逻辑运算符通常与布尔(逻辑)值一起使用。当它们存在时,它们返回一个布尔值。 然而,&& 和 ||运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们将返回一个非布尔值

          here's the table 与所有逻辑运算符的返回值。

          【讨论】:

          • 简洁实用的答案,带有指向更深层资源的链接。会接受。
          猜你喜欢
          • 2014-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-23
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 2010-10-29
          相关资源
          最近更新 更多