为什么JavaScript中的or运算符的行为与C中的不同?

Bap*_*api -14 javascript c logical-or

考虑下面的代码。

console.log("All" && 1); // 1
console.log("All" || 1); // "All" ?
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个表达式"All" && 1正确计算为1。我希望第二个表达式也会"All" || 1求值1。但是,它的值为"All"。为什么这样?

在C中,第二个表达式正确计算为1

#include <stdio.h>

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

为什么JavaScript的行为有所不同?

Aad*_*hah 6

C语言中的逻辑运算符始终求值为布尔值。在C中,int 1代表true和int 0代表false。这就是为什么两个表达式,原因"All" && 1"All" || 1,计算为1。他们在逻辑上都是正确的。为了澄清起见,请考虑以下程序。

#include <stdio.h>

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

在上面的程序中,即使这些表达式中没有表达式20 && 10,它们20 || 10仍然会求和。这是有道理的,因为这两个表达式在逻辑上都是正确的。因此,他们评估与JavaScript中的等同。111true

如果JavaScript的行为方式Ç没有那么表情"All" && 10"All" || 10将评估为布尔值true。但是,这不是逻辑运算符在JavaScript中的行为方式。这并不是说他们有越野车。

JavaScript中的值具有真实性和虚假性的概念。例如,值true"All"10[10, 20]{ foo: 10 },和x => 2 * x都是truthy。在另一方面,价值观false""0undefined,和null是falsy。

JavaScript的逻辑运算符并不总是像C那样对布尔值求值。而是,它们求值为其操作数之一。如果&&运算符错误,则运算符将求值为其左操作数。否则,它将计算为正确的操作数。同样,如果||运算符为真,则对其左操作数求值。否则,它将计算为正确的操作数。

现在,价值"All"是真实的。因此,"All" && 1求值为右操作数(即1),而"All" || 1求值为左操作数(即"All")。请注意,1和和"All"均为真实值,这意味着它们等效1于C中的(代表真实性)。

因此,没有。JavaScript不是越野车。