-16

考虑以下代码。

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

如您所见,第一个表达式 ,"All" && 1的计算结果为1。这肯定不是布尔值(不是 a true)。我希望这里更准确。因为我没有将结果强制为String.

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

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

#include <stdio.h>

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

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

4

2 回答 2

8

C 中的逻辑运算符总是计算为布尔值。在 C 中,int1表示true,int0表示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 && 10and20 || 10仍然会计算为。这是有道理的,因为这两个表达式在逻辑上都是正确的。因此,他们评估哪个等同于 JavaScript。111true

如果 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"都是真实值,这意味着它们等价1于 C 中的(表示真实性)。

因此,没有。JavaScript 不是错误的。

于 2019-09-02T18:17:33.793 回答
-6

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

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

让我们举几个例子,

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

在最初看到 JavaScript0的第一个 console.log 中,JS 解释器停止并返回第一个值。

发生这种情况是因为当 JS 解释器将第一个值转换为布尔值时,它评估为false. 我们知道 "在任何&&运算符上,如果单个值存在false,它将返回false

所以这里的 JS 解释器试图通过返回之前来节省一些计算能力,而不需要完整的语句评估。这是伟大的。

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

于 2019-09-02T18:37:02.113 回答