[英]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.