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

the*_*ist 48 javascript logical-operators

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

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

var _ = obj && obj._;
Run Code Online (Sandbox Code Playgroud)

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

Dra*_*ord 66

在JavaScript中,两个||&&是逻辑短路运营商从左至右评价时返回第一个完全确定的"逻辑值".

在表达式中X || Y,X首先进行求值,并将其解释为布尔值.如果此布尔值为"true",则返回该值.而且Y没有评估.(因为无论Y是真还是Y假都没关系,X || Y已经完全确定了.)那就是短路部分.

如果这个布尔值是"假",那么X || Y在我们评估之前,我们仍然不知道是真还是假Y,并将其解释为布尔值.然后Y返回.

并且&&相同,除了它停止评估第一个参数是否为假.

第一个棘手的部分是,当表达式被评估为"true"时,表达式本身就会被返回.在逻辑表达式中计为"true",但您也可以使用它.所以这就是你看到返回实际值的原因.

第二个棘手的部分是,当一个表达式被评估为"false"时,那么在JS 1.0和1.1中,系统将返回一个布尔值"false"; 而在JS 1.2中,它返回表达式的实际值.

在JS false,0,-0,"",null,undefined,NaNdocument.all所有的算假的.

在这里,我当然引用逻辑值进行讨论.当然,文字字符串"false"与值不同false,因此是正确的.

  • 这都是事实,但没有回答问题。他问“为什么”。 (2认同)

Sam*_*ton 61

用最简单的术语来说:

||运算符返回第一truthy值,并且如果没有一个是truthy,它返回最后一个值(这是一个falsy值).

&&运算符返回第一falsy值,如果没有一个是falsy,它返回的最后一个值(这是一个truthy值).

这真的很简单.在您的控制台中进行实验,亲眼看看.

"" && "Dog"    // ""
"Cat" && "Dog" // "Dog"
"" || "Dog"    // "Dog"
"Cat" || "Dog" // "Cat"
Run Code Online (Sandbox Code Playgroud)

  • 你的答案真的是最容易理解的.谢谢. (7认同)

San*_*kha 19

var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false 
Run Code Online (Sandbox Code Playgroud)

将返回布尔值.

UPDATE

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

它是一个分配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;
Run Code Online (Sandbox Code Playgroud)

你的表达:

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
Run Code Online (Sandbox Code Playgroud)

另一个表达:

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
Run Code Online (Sandbox Code Playgroud)

另一个表达:

var _ = obj && obj._;

// _ = obj._
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用!! x来强制x到布尔值 (4认同)

evi*_*iko 7

在大多数编程语言中,&&||运算符返回布尔值。在 JavaScript 中则不同


或运算符:

它返回的值,第一个操作数,用于验证为真(如果有的话),否则返回的值最后一个操作数(即使它证明为假)

示例 1:

var a = 0 || 1 || 2 || 3;
        ^    ^    ^    ^
        f    t    t    t
             ^
             first operand that validates as true
             so, a = 1
Run Code Online (Sandbox Code Playgroud)

示例 2:

var a = 0 || false || null || '';
        ^    ^        ^       ^
        f    f        f       f
                              ^
                              no operand validates as true,
                              so, a = ''
Run Code Online (Sandbox Code Playgroud)

AND 运算符:

它返回最后一个验证为真的操作数的值(如果所有条件都验证为真),否则返回第一个验证为 false 的操作数的值

示例 1:

var a = 1 && 2 && 3 && 4;
        ^    ^    ^    ^
        t    t    t    t
                       ^
                       last operand that validates as true
                       so, a = 4
Run Code Online (Sandbox Code Playgroud)

示例 2:

var a = 2 && '' && 3 && null;
        ^    ^     ^    ^
        t    f     t    f
             ^
             return first operand that validates as false,
             so, a = ''
Run Code Online (Sandbox Code Playgroud)

结论:

如果您希望 JavaScript 以与其他编程语言相同的方式工作,请使用Boolean()函数,如下所示:

var a = Boolean(1 || 2 || 3);// a = true
Run Code Online (Sandbox Code Playgroud)


Jac*_*esB 5

您应该将短路运算符视为条件而不是逻辑运算符。

x || y 大致对应于:

if ( x ) { return x; } else { return y; }  
Run Code Online (Sandbox Code Playgroud)

x && y大致对应于:

if ( x ) { return y; } else { return x; }  
Run Code Online (Sandbox Code Playgroud)

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


来自MDN 文档

逻辑运算符通常与布尔(逻辑)值一起使用。当它们是时,它们返回一个布尔值。然而,&& 和 || 运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们将返回一个非布尔值

这里的表与所有逻辑运算符的返回值。