一本书规定遵守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
如何为这些规则证明这种行为?
答案 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 强>
让
lref
成为评估LogicalORExpression的结果。让
lval
成为GetValue(lref)
。如果
ToBoolean(lval)
为true
,请返回lval
。让
rref
成为评估LogicalANDExpression的结果。- 醇>
返回
GetValue(rref)
。
答案 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中试过这个,希望其他浏览器的内容会保持一致。