2011-03-24 40 views
37

为什么这些逻辑运算符返回一个对象而不是布尔值?为什么逻辑运算符(&&和||)总是返回布尔结果?

var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {}); 

var _ = obj && obj._; 

我想知道为什么它会返回obj.fn()结果(如果它被定义)或obj._,但不是布尔结果。

+7

我认为他想知道为什么'一个|| b'不返回布尔值,而是返回'a'或'b'。 – ThiefMaster 2011-03-24 10:52:16

+1

不'var _ = obj && obj ._''返回一个布尔值? O.o /然后它返回什么?第一个评估为虚假evt。如果所有的都是真的,最后的结果是真的 – Alxandr 2011-03-24 11:05:32

+0

ThiefMaster,这正是我的意思。我更新了我的帖子 – theateist 2011-03-24 11:05:36

回答

13
var _ = ((obj.fn && obj.fn()) || obj._ || (obj._ == {/*soemthign*/}))? true: false 

将返回布尔值。

UPDATE

请注意,这是基于我的测试。我不能完全信赖。

这是一个表达式,确实是不是分配truefalse值。相反,它分配计算的值。

让我们来看看这个表达式。

一个例子表达式:

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._ 
+0

experimentX,我更新了我的帖子。它返回一个** fn **或** obj ._ **的结果,但不是布尔值。 – theateist 2011-03-24 11:07:04

+2

你也可以使用!! x强制x布尔值 – JoelFan 2014-04-30 19:59:14

+0

如果有人需要:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators – 2018-02-09 20:17:21

1

首先,它必须是真实的回报,所以如果你正在测试的真实性,然后它没有什么区别

其次,它可以让你做线沿线的分配:

function bar(foo) { 
    foo = foo || "default value"; 
54

在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的值不同,因此是正确的。 ]

1

大家可以参考JS的规范(11.11)在这里:

语义

生产LogicalANDExpression:LogicalANDExpression & & BitwiseORExpression如下评价:

  1. 评估LogicalANDExpression。

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为规范

1

比较:

var prop; 
if (obj.value) {prop=obj.value;} 
else prop=0; 

有:

var prop=obj.value||0; 

返回一个truthy表达 - 而不仅仅是真或假的 - 通常是使你的代码更短,仍可读。 ||这是很常见的,对于& &没有那么多。

2

我认为你在这里有基本的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' 
+0

'!! condition1' is从真实或虚假结果中获得布尔型“真”或“假”的一种简单得多的方法。 – Pointy 2016-08-16 15:44:21

35

简单的说:

||运算符返回第一个真值,如果没有真值,它返回最后一个值(这是一个虚假值)。

&&运算符返回第一个falsy值,如果没有falsy值,则返回最后一个值(它是一个真值)。

其实很简单。在你的控制台上进行实验,看看你自己。

+3

你的答案确实是最容易理解的。谢谢。 – realtebo 2016-11-18 11:49:33

0

使用Boolean()功能,如:

var a = 0 || 1;// a = 1 
var a = Boolean(0 || 1);// a = true 
0

你可以使用!在得到布尔结果的条件之前。

!!(X && Y) // returns true if both X and Y are not null or undefined