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

IT技术 javascript logical-operators
2021-01-31 02:44:32

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

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

var _ = obj && obj._;

我想了解为什么它返回obj.fn()(如果已定义) ORobj._结果而不是布尔结果。

6个回答

在 JavaScript 中,||&&都是逻辑短路运算符,当从左到右计算时,它们返回第一个完全确定的“逻辑值”。

在 expression 中X || YX首先计算,并解释为布尔值。如果此布尔值为“true”,则返回它。并且Y不被评估。(因为Y真假无所谓YX || Y已经完全确定了。)那就是短路部分。

如果这个布尔值是“假”,那么X || Y在我们评估之前我们仍然不知道是真还是假Y,并将其解释为一个布尔值。所以然后Y被退回。

&&执行相同的操作,除了它停止评估第一个参数是否为假。

第一个棘手的部分是当表达式被评估为“真”时,然后返回表达式本身。这在逻辑表达式中算作“真”,但您也可以使用它。所以这就是您看到返回实际值的原因。

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

在 JSfalse0,, -0, "", null, undefined,NaNdocument.all算作 false

在这里,我当然是为了讨论而引用逻辑值。当然,文字字符串"false"与 value 不同false,因此为真。

这都是真的,但并没有回答这个问题。他问“为什么”。
2021-04-02 02:44:32

用最简单的话来说:

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

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

真的就是这么简单。在您的控制台中进行实验以亲自查看。

console.log("" && "Dog");    // ""
console.log("Cat" && "Dog"); // "Dog"
console.log("" || "Dog");    // "Dog"
console.log("Cat" || "Dog"); // "Cat"

你的回答真的是最容易理解的。谢谢。
2021-03-20 02:44:32
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._
实验X,我更新了我的帖子。它返回fnobj._的结果之一,但不是布尔值。
2021-03-14 02:44:32
2021-03-16 02:44:32
或者简单地 var _ = !!((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}));
2021-03-19 02:44:32
您还可以使用 !!x 强制 x 为布尔值
2021-03-22 02:44:32

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


或运算符:

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

示例 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 运算符:

它返回最后一个验证为真的操作数的值(如果所有条件都验证为真),否则返回第一个验证为 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
             ^
             return first operand that validates as false,
             so, a = ''

结论:

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

var a = Boolean(1 || 2 || 3);// a = true

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

x || y 大致对应于:

if ( x ) { return x; } else { return y; }  

x && y大致对应于:

if ( x ) { return y; } else { return x; }  

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


来自MDN 文档

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

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

简洁而有用的答案,带有指向更深层次资源的链接。会接受。
2021-04-01 02:44:32