[英]Logical OR (||) in JavaScript
一本書闡明了OR的以下規則:
但是我在編碼時觀察到以下行為:
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
的操作數,或者用完為止。
令
lref
為評估LogicalORExpression的結果。令
lval
為GetValue(lref)
。如果
ToBoolean(lval)
為true
,則返回lval
。令
rref
為評估LogicalANDExpression的結果。返回
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.