JavaScript中的逻辑OR(||)

时间:2012-09-08 14:06:55

标签: javascript

一本书规定遵守OR的规则:

  • 如果第一个操作数是一个对象,则返回第一个操作数。
  • 如果第一个操作数的计算结果为false,则返回第二个操作数。
  • 如果两个操作数都是对象,则返回第一个操作数。
  • 如果两个操作数都为null,则返回null。
  • 如果两个操作数均为NaN,则返回NaN。
  • 如果两个操作数都未定义,则返回undefined。

但是我在编码时观察到以下行为:

        var result18 = (NaNVar || undefinedVar);  //undefined
        var result19 = (NaNVar || nullVar);  //null
        var result20 = (undefinedVar || NaNVar);  //NaN
        var result21 = (undefinedVar || nullVar); //null
        var result22 = (nullVar || NaNVar); //NaN
        var result23 = (nullVar || undefined);   //undefined

如何为这些规则证明这种行为?

4 个答案:

答案 0 :(得分:5)

这条规则是关键:

  

如果第一个操作数的计算结果为false,则第二个操作数为   返回。

所有左侧值都评估为false,因此返回右侧。

如果它对您有所帮助,这是MDN的一个很好的定义:

  

expr1 ||表达式2

     

如果可以转换为true,则返回expr1;否则,返回   表达式2。因此,当与布尔值一起使用时,||如果有,则返回true   操作数是真的;如果两者都为假,则返回false。

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

答案 1 :(得分:3)

对于书中描述的混淆感到抱歉。我试图列举边缘情况,我看到这可能会引起一些混乱。

您可以使用两个规则准确描述操作:如果第一个参数是真实的,则返回第一个参数;如果第一个参数是falsy则返回第二个参数。您的第三条规则不仅适用于此运算符,当您尝试使用它时,未声明的变量将始终导致她被抛出。你试图使用它并不重要(除了typeof和delete,它在未声明的变量中工作正常)。

答案 2 :(得分:2)

您的书选择了一种可怕的方式来描述逻辑OR运算符。

例如,这条规则太有限了。

  

如果第一个操作数是一个对象,则返回第一个操作数。

操作员不进行任何类型的检查。它不关心第一个或第二个操作数是否是“对象”。它只关心它们如何强制转换为布尔值。

举个例子。

"foobar" || false

第一个操作数是一个字符串,而不是一个对象,但它会强制转换为布尔值true,因此返回第一个操作数。

Boolean("foobar"); // true

你的书正在浏览子弹点,好像它遵循某种指定的算法。没有这样的算法。比较严格基于布尔强制。

简单地说,

  • 它从左到右评估操作数,直到发现一个操作数将强制转换为true或直到它用完操作数。
  • 返回评估的最后一个操作数(未强制)
  

<强> 11.11 Binary Logical Operators

     
      
  1. lref成为评估LogicalORExpression的结果。

  2.   
  3. lval成为GetValue(lref)

  4.   
  5. 如果ToBoolean(lval)true,请返回lval

  6.   
  7. rref成为评估LogicalANDExpression的结果。

  8.   
  9. 返回GetValue(rref)

  10.   

答案 3 :(得分:0)

是的,在观察结果后,我总结了两个简单的规则:

        //1: if the first operand evaluates to true then it is returned (here it means actual //value of operand is returned but not the evaluated value that is true)
        //following values evaluates to ture: non-empty string, non-zero number and //none of these values- NaN, null, undefined

        var result = ("Mahesh" || false) //"Mahesh"
        var result = ("Mahesh" || true) //"Mahesh"
        var result = ("Mahesh" || undefined) //"Mahesh"
        var result = ("Mahesh" || null) //"Mahesh"
        var result = ("Mahesh" || NaN) //"Mahesh"
        var result = (5 || false) //5
        var result = (5 || true) //5
        var result = (5 || null) //5
        var result = (5 || NaN) //5
        var result = (5 || undefined) //5

        //2: if first operand evaluates to false then the value of second operand is //returned, again without evaluating it
        //following values evaluate to false: empty string (""), number zero (0),  null, //NaN, undefined or false)

        var result = (false || NaN);  //NaN
        var result = (false || null);  //null
        var result = (false || undefined);  //undefined
        var result = (false || "Mahesh");  //Mahesh
        var result = (false || 5);  //5

        var result = (NaN || false);   //false
        var result = (NaN || true);   //true
        var result = (NaN || NaN);   //NaN
        var result = (NaN || null);  //null
        var result = (NaN || undefined);  //undefined
        var result = (NaN || "Mahesh");   //Mahesh
        var result = (NaN || 5);   //5

        var result = (null || false);  //false
        var result = (null || true);  //true
        var result = (null || NaN); //NaN
        var result = (null || null);  //null
        var result = (null || undefined);   //undefined
        var result = (null || "Mahesh");  //Mahesh
        var result = (null || 5);  //5

        var result = (undefined || false);  //false    
        var result = (undefined || true);  //true
        var result = (undefined || NaN);  //NaN
        var result = (undefined || null); //null
        var result = (undefined || undefined);  //undefined
        var result = (undefined || "Mahesh");  //Mahesh
        var result = (undefined || 5);  //5

        var result = (0 || false); //false
        var result = (0 || true); //true
        var result = (0 || NaN); //NaN
        var result = (0 || null);  //null
        var result = (0 || undefined);   //undefined
        var result = (0 || "Mahesh"); //Mahesh
        var result = (0 || 5); //5

        var result = ("" || false); //false
        var result = ("" || true); //true
        var result = ("" || NaN); //NaN
        var result = (""|| null);  //null
        var result = (""|| undefined);   //undefined
        var result = ("" || "Mahesh"); //Mahesh
        var result = ("" || 5); //5

        //Note: if the first operand evaluates to false and if the second operand is undeclared 
        //variable then it will cause an error
        var result = (false || undeclaredVar);    //error

我认为用简单的词汇就可以了。谁能在这里确认我是否有正确的理解? 我在IE10中试过这个,希望其他浏览器的内容会保持一致。