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

时间:2019-09-02 07:30:30

标签: javascript c logical-or

请考虑以下代码。

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

如您所见,第一个表达式"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;
}

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

2 个答案:

答案 0 :(得分:6)

C中的逻辑运算符始终求值为布尔值。在C中,整数1表示true,整数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;
}

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

如果JavaScript的行为方式与C相同,则表达式"All" && 10"All" || 10的值将为布尔值true。但是,这不是逻辑运算符在JavaScript中的行为方式。并不是说他们有越野车。

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

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

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

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

答案 1 :(得分:-5)

让我们举一些例子,

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

因为在第一个console.log中,当JavaScript首先看到0时,它将停止求值并返回第一个值。 因为在逻辑“和”中,如果一个条件为假,则结果为假。 JavaScript通过尽早返回来保存相同的内存。但是在第二种情况下,第一个操作数的值为true。因此,结果取决于第二个操作数。因此,JavaScript巧妙地返回了第二个操作数。如您所见,a.b不存在,因此它返回类型错误。 逻辑||也会发生这种情况或运算符。或如果运算符之一为true,则operator返回true。关于它的问题返回所有字符串。因为任何非空字符串都将评估真值。因此,无需更多检查。因此,只需返回所有字符串。最终,通过类型对话,“所有”字符串变成了真值。