为什么逻辑运算符(&&和||)总是返回布尔结果?

时间:2011-03-24 10:48:44

标签: javascript logical-operators

为什么这些逻辑运算符返回一个对象而不是布尔值?

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

var _ = obj && obj._;

我想理解为什么它会返回obj.fn()(如果已定义)或obj._但不是布尔结果的结果。

9 个答案:

答案 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 false0-0""nullundefinedNaN和{{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 

将返回布尔值。

<强>更新

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

这是一个分配truefalse值的表达式。而是指定计算值。

我们来看看这个表达式。

示例表达式:

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的评估如下:

  1. 评估LogicalANDExpression。
  2. 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; }  

鉴于此,结果是完全可以理解的。

相关问题