为什么 ||JavaScript 中的 (or) 和 && (and) 运算符的行为与 C 中的行为不同(返回非布尔值)?

Why does the || (or) and && (and) operator in JavaScript behave differently than in C (returning non boolean value)?

提问人:Bapi 提问时间:9/2/2019 最后编辑:Bapi 更新时间:7/28/2021 访问量:690

问:

请考虑以下代码。

console.log("All" && 1); // 1
console.log("All" || 1); // "All" 

如您所见,第一个表达式 的计算结果为 。这肯定不是布尔值(不是 )。我在这里更具体地期望。因为我没有强迫结果。"All" && 11trueString

第二个表达式 , ,计算结果为 。这也不是布尔值。"All" || 1All

在 C 语言中,both 表达式的计算结果为 。当我强制结果转换为字符串时。1

#include <stdio.h>

int main() {
    printf("%d\n", "All" && 1); // 1
    printf("%d\n", "All" || 1); // 1
    return 0;
}

为什么 JavaScript 的行为不同?更具体地说,为什么 JS 返回非布尔值?

JavaScript C 或逻辑

评论


答:

9赞 Aadit M Shah 9/3/2019 #1

C 语言中的逻辑运算符的计算结果始终为布尔值。在 C 中,int 表示,int 表示 。这就是为什么表达式 和 的计算结果都为 的原因。两者在逻辑上都是正确的。为清楚起见,请考虑以下程序。1true0false"All" && 1"All" || 11

#include <stdio.h>

int main() {
    printf("%d\n", 20 && 10); // 1
    printf("%d\n", 20 || 10); // 1
    return 0;
}

在上面的程序中,表达式和计算结果仍然为,即使这些表达式中没有。这是有道理的,因为这两个表达式在逻辑上都是正确的。因此,它们的计算结果相当于 JavaScript 中的哪个。20 && 1020 || 10111true

如果 JavaScript 的行为方式与 C 相同,则表达式 和 的计算结果为 布尔值 。但是,这不是逻辑运算符在 JavaScript 中的行为方式。这并不是说它们是有缺陷的。"All" && 10"All" || 10true

JavaScript 中的值具有真实性和虚假性的概念。例如,值 、 、 、 和 都是真实的。另一方面,值 、 、 和 是虚假的。true"All"10[10, 20]{ foo: 10 }x => 2 * xfalse""0undefinednull

JavaScript 的逻辑运算符并不总是像 C 那样计算为布尔值。相反,它们根据其中一个操作数进行计算。如果操作数是假的,则运算符将计算到其左操作数。否则,它的计算结果为正确的操作数。同样,运算符计算其左操作数是否为真。否则,它的计算结果为正确的操作数。&&||

现在,这个值是真实的。因此,计算到右操作数(即),而计算到左操作数(即)。请注意,这两个 and 都是真值,这意味着它们等价于 C 中的(表示真值)。"All""All" && 11"All" || 1"All"1"All"1

因此,没有。JavaScript 没有错误。

-6赞 Bapi 9/3/2019 #2

我在这里引用官方文档:- JS中的逻辑AND

当且仅当一组操作数的所有操作数都为真时,一组操作数的逻辑 AND (&&) 运算符(逻辑连词)为 true。它通常与布尔值(逻辑)值一起使用。如果是,则返回布尔值。但是,&&运算符实际上返回指定操作数之一的值,因此,如果此运算符与非布尔值一起使用,它将返回非布尔值。

让我们举一些例子,

let a = [1,2,3];
console.log( 0 && a.b ); // return 0
console.log( 1 && a.b ); // return a type error.

在第一个控制台 .log 中,当 JavaScript 首先看到时,JS 解释器停止并返回第一个值。0

发生这种情况是因为当 JS 解释器将第一个值转换为布尔值时,它的计算结果为 .我们知道这样一个事实,“在任何&&运算符上,如果单个值为false,它将返回falsefalse

所以这里的JS解释器尝试通过返回之前来节省一些计算能力,而没有完整的语句计算。这很棒。

LOGICAL OR (||) 运算符也是如此。