为什么这些逻辑运算符返回一个对象而不是布尔值?为什么逻辑运算符(&&和||)总是返回布尔结果?
var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {});
var _ = obj && obj._;
我想知道为什么它会返回obj.fn()
结果(如果它被定义)或obj._
,但不是布尔结果。
为什么这些逻辑运算符返回一个对象而不是布尔值?为什么逻辑运算符(&&和||)总是返回布尔结果?
var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {});
var _ = obj && obj._;
我想知道为什么它会返回obj.fn()
结果(如果它被定义)或obj._
,但不是布尔结果。
var _ = ((obj.fn && obj.fn()) || obj._ || (obj._ == {/*soemthign*/}))? true: false
将返回布尔值。
UPDATE
请注意,这是基于我的测试。我不能完全信赖。
这是一个表达式,确实是不是分配true
或false
值。相反,它分配计算的值。
让我们来看看这个表达式。
一个例子表达式:
var a = 1 || 2;
//a = 1
//its 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._
首先,它必须是真实的回报,所以如果你正在测试的真实性,然后它没有什么区别
其次,它可以让你做线沿线的分配:
function bar(foo) {
foo = foo || "default value";
在JavaScript中,并且& &是逻辑短路运算符,当从左向右评估时返回第一个完全确定的“逻辑值”。
在表达式X || Y中,首先计算X,并将其解释为布尔值。 如果此布尔值为“true”,则返回该值。而Y没有被评估。 (因为Y是真还是Y是假,X || Y已经完全确定了。)这就是短路部分。 如果此布尔值为“false”,那么我们仍然不知道X || Y是真还是假,直到我们计算Y为止,并将其解释为布尔值。那么Y就会返回。
AND & &也是这样,除非停止评估,如果第一个参数为false。
第一个棘手的部分是,当表达式被评估为“真”时,表达式本身被返回。在逻辑表达式中它被视为“真”,但您也可以使用它。所以这就是为什么你看到返回的实际值。
第二个棘手的部分是,当表达式评估为“false”时,则在JS 1.0和1中。1系统将返回一个布尔值“false”;而在JS 1.2中则返回表达式的实际值。
在JS中,null,false,0,“”和undefined都算作false。
[这里我引用逻辑值是为了讨论。当然,字符串“f a l s e”“false”与false的值不同,因此是正确的。 ]
大家可以参考JS的规范(11.11)在这里:
语义
生产LogicalANDExpression:LogicalANDExpression & & BitwiseORExpression如下评价:
2.Call GetValue(Result(1))。
3.Call ToBoolean(Result(2))。
4.如果Result(3)为false,则返回Result(2)。
5.评估BitwiseORExpression。
6.Call GetValue(Result(5))。
7.返回结果(6)。
看到here为规范
比较:
var prop;
if (obj.value) {prop=obj.value;}
else prop=0;
有:
var prop=obj.value||0;
返回一个truthy表达 - 而不仅仅是真或假的 - 通常是使你的代码更短,仍可读。 ||这是很常见的,对于& &没有那么多。
我认为你在这里有基本的JavaScript Methodology问题。 现在,JavaScript是一种松散类型的语言,因此它处理逻辑操作的方式和方式不同于其他标准语言,如Java & C++。 JavaScript使用称为“类型强制”的概念来确定逻辑操作的值,并始终返回第一个“true”类型的值。例如,看看下面的代码:
var x = myshit || document;
// after execution of the line above, x = document
这是因为“myshit”是一个先验未定义的实体进行测试时将总是为false 正因为如此,JavaScript的跳过这一点,并测试下一个实体为“真正的”价值。由于JavaScript文档对象是已知的,因此它返回一个真正的值,JavaScript返回这个对象。
如果你想退还给您一个布尔值,你有你的逻辑条件语句传递给一个函数,像这样:
var condition1 = myshit || 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'
'!! condition1' is从真实或虚假结果中获得布尔型“真”或“假”的一种简单得多的方法。 – Pointy 2016-08-16 15:44:21
简单的说:
的||
运算符返回第一个真值,如果没有真值,它返回最后一个值(这是一个虚假值)。
&&
运算符返回第一个falsy值,如果没有falsy值,则返回最后一个值(它是一个真值)。
其实很简单。在你的控制台上进行实验,看看你自己。
你的答案确实是最容易理解的。谢谢。 – realtebo 2016-11-18 11:49:33
使用Boolean()
功能,如:
var a = 0 || 1;// a = 1
var a = Boolean(0 || 1);// a = true
你可以使用!在得到布尔结果的条件之前。
!!(X && Y) // returns true if both X and Y are not null or undefined
我认为他想知道为什么'一个|| b'不返回布尔值,而是返回'a'或'b'。 – ThiefMaster 2011-03-24 10:52:16
不'var _ = obj && obj ._''返回一个布尔值? O.o /然后它返回什么?第一个评估为虚假evt。如果所有的都是真的,最后的结果是真的 – Alxandr 2011-03-24 11:05:32
ThiefMaster,这正是我的意思。我更新了我的帖子 – theateist 2011-03-24 11:05:36