簡體   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