为什么这些逻辑运算符返回一个对象而不是布尔值?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
我想理解为什么它会返回obj.fn()
(如果已定义)或obj._
但不是布尔结果的结果。
答案 0 :(得分:65)
在JavaScript中,||
和&&
都是逻辑短路运算符,从左到右进行评估时返回第一个完全确定的“逻辑值”。
在表达式X || Y
中,首先计算X
,并将其解释为布尔值。如果此布尔值为“true”,则返回该值。并且Y
未被评估。 (因为Y
是否为真或Y
为假并不重要,X || Y
已完全确定。)这是短路部分。
如果此布尔值为“false”,那么在我们评估X || Y
之前,我们仍然不知道Y
是真还是假,并将其解释为布尔值。所以然后返回Y
。
并且&&
执行相同的操作,但它会停止评估第一个参数是否为false。
第一个棘手的部分是当表达式被评估为“true”时,表达式本身就会被返回。在逻辑表达式中计为“true”,但您也可以使用它。所以这就是你看到返回实际值的原因。
第二个棘手的部分是,当一个表达式被评估为“false”时,那么在JS 1.0和1.1中,系统将返回一个布尔值“false”;而在JS 1.2中,它返回表达式的实际值。
在JS false
,0
,-0
,""
,null
,undefined
,NaN
和{{1所有count as false。
在这里,我当然引用逻辑值进行讨论。当然,文字字符串document.all
与值"false"
不同,因此是正确的。
答案 1 :(得分:52)
用最简单的术语来说:
||
运算符返回第一个truthy值,如果没有,则返回最后一个值(这是一个假值)。
&&
运算符返回第一个falsy值,如果没有,则返回最后一个值(这是一个真值)。
真的那么简单。在您的控制台中进行实验,亲眼看看。
"" && "Dog" // ""
"Cat" && "Dog" // "Dog"
"" || "Dog" // "Dog"
"Cat" || "Dog" // "Cat"

答案 2 :(得分:17)
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false
将返回布尔值。
<强>更新强>
请注意,这是基于我的测试。我不能完全依赖。
这是一个不分配true
或false
值的表达式。而是指定计算值。
我们来看看这个表达式。
示例表达式:
var a = 1 || 2;
// a = 1
// it's because a will take the value (which is not null) from left
var a = 0 || 2;
// so for this a=2; //its because the closest is 2 (which is not null)
var a = 0 || 2 || 1; //here also a = 2;
你的表达:
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
// _ = closest of the expression which is not null
// in your case it must be (obj.fn && obj.fn())
// so you are gettig this
另一种表达方式:
var a = 1 && 2;
// a = 2
var a = 1 && 2 && 3;
// a = 3 //for && operator it will take the fartest value
// as long as every expression is true
var a = 0 && 2 && 3;
// a = 0
另一种表达方式:
var _ = obj && obj._;
// _ = obj._
答案 3 :(得分:3)
我认为您在这里有基本的JavaScript方法问题。
现在,JavaScript是一种松散类型的语言。因此,它处理逻辑操作的方式和方式不同于其他标准语言,如Java和C ++。 JavaScript使用称为“类型强制”的概念来确定逻辑运算的值,并始终返回第一个true
类型的值。例如,看看下面的代码:
var x = mystuff || document;
// after execution of the line above, x = document
这是因为mystuff
是一个先验未定义的实体,在测试时它总是会评估为false
,因此,JavaScript跳过这个并测试下一个实体true
值。true
由于JavaScript已知文档对象,因此它返回var condition1 = mystuff || document;
function returnBool(cond){
if(typeof(cond) != 'boolean'){ //the condition type will return 'object' in this case
return new Boolean(cond).valueOf();
}else{ return; }
}
// Then we test...
var condition2 = returnBool(condition1);
window.console.log(typeof(condition2)); // outputs 'boolean'
值,JavaScript返回此对象。
如果您想要返回一个布尔值,则必须将逻辑条件语句传递给类似的函数:
{{1}}
答案 4 :(得分:2)
我们可以在这里参考JS的规范(11.11):
语义
生产LogicalANDExpression:LogicalANDExpression&amp;&amp; BitwiseORExpression的评估如下:
2.Call GetValue(结果(1))。
3.Call ToBoolean(Result(2))。
4.如果结果(3)为假,则返回结果(2)。
5.评估BitwiseORExpression。
6.Call GetValue(结果(5))。
7.返回结果(6)。
请参阅here了解规范
答案 5 :(得分:2)
在大多数编程语言中,&&
和||
运算符返回布尔值。 在JavaScript中它有所不同。
OR运营商:
返回第一个操作数的值,验证为true(如果有),否则返回最后一个操作数的值(即使它验证为false)。
示例1:
var a = 0 || 1 || 2 || 3;
^ ^ ^ ^
f t t t
^
first operand that validates as true
so, a = 1
示例2:
var a = 0 || false || null || '';
^ ^ ^ ^
f f f f
^
no operand validates as true,
so, a = ''
AND运营商:
返回验证为true的最后一个操作数的值(如果所有条件验证为true),否则返回第一个操作数的值验证为false 。
示例1:
var a = 1 && 2 && 3 && 4;
^ ^ ^ ^
t t t t
^
last operand that validates as true
so, a = 4
示例2:
var a = 2 && '' && 3 && null;
^ ^ ^ ^
t f t f
^
entire condition is false, so return first operand that validates as false,
so, a = ''
<强>结论:强>
如果您希望JavaScript的行为与其他编程语言的工作方式相同,请使用Boolean()
函数,如下所示:
var a = Boolean(1 || 2 || 3);// a = true
答案 6 :(得分:1)
首先,它必须是真实的回归,所以如果你正在测试真实性,那么它没有任何区别
其次,它允许您按照以下方式进行分配:
function bar(foo) {
foo = foo || "default value";
答案 7 :(得分:1)
比较
var prop;
if (obj.value) {prop=obj.value;}
else prop=0;
使用:
var prop=obj.value||0;
返回一个真实的表达 - 而不仅仅是真或假 - 通常会使你的代码变短并且仍然可读。这对于||非常常见,而对于&amp;&amp;。
则不是很常见答案 8 :(得分:0)
与逻辑运算符相比,您应该将短路运算符视为条件评级者。
x || y
大致对应于:
if (x) { return x } else { return y; }
和x && y
大致对应于:
if (x) { return y } else { return x; }
鉴于此,结果是完全可以理解的。