繁体   English   中英

JavaScript中的逻辑或(||)

[英]Logical OR (||) in JavaScript

一本书阐明了OR的以下规则:

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

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

        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

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

此规则是关键:

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

您所有的左侧值都计算为false,因此返回右侧。

如果可以帮助您,以下是MDN的一个很好的定义:

expr1 || expr2

如果可以将其转换为true,则返回expr1;否则,返回false。 否则,返回expr2。 因此,当与布尔值一起使用时,|| 如果任一操作数为true,则返回true;否则为false。 如果两者均为假,则返回false。

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/Logical_Operators

对不起,本书中的描述令人困惑。 我试图枚举边缘情况,我发现这可能引起一些混乱。

您可以仅使用两个规则来准确描述操作:如果第一个参数为真,则返回第一个参数; 如果第一个参数为假,则返回第二个参数。 您的第三条规则不仅适用于该运算符,当您尝试使用它时,未声明的变量将始终导致她被抛出。 不管您打算使用它什么都没有关系(typeof和delete除外,它们在未声明的变量中可以正常工作)。

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

例如,此规则过于局限。

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

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

举这个例子。

"foobar" || false

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

Boolean("foobar"); // true

您的书正在遵循要点,就好像它遵循某种指定的算法一样。 没有这样的算法。 比较严格地基于布尔强制。

简而言之,

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

11.11二元逻辑运算符

  1. lref为评估LogicalORExpression的结果。

  2. lvalGetValue(lref)

  3. 如果ToBoolean(lval)true ,则返回lval

  4. rref为评估LogicalANDExpression的结果。

  5. 返回GetValue(rref)

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

        //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中尝试过此方法,希望其他浏览器之间保持一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM