【问题标题】:Why does the || (or) and && (and) operator in JavaScript behave differently than in C (returning non boolean value)?为什么|| JavaScript 中的 (or) 和 && (and) 运算符的行为与 C 中的不同(返回非布尔值)?
【发布时间】:2020-01-05 06:07:28
【问题描述】:

考虑下面的代码。

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

如您所见,第一个表达式 "All" && 1 的计算结果为 1。这肯定不是布尔值(不是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 返回一个非布尔值?

【问题讨论】:

    标签: javascript c logical-or logical-and


    【解决方案1】:

    C 中的逻辑运算符总是计算为布尔值。在 C 中,int 1 代表 true,int 0 代表 false。这就是"All" &amp;&amp; 1"All" || 1 这两个表达式的计算结果为1 的原因。两者在逻辑上都是正确的。为澄清起见,请考虑以下程序。

    #include <stdio.h>
    
    int main() {
        printf("%d\n", 20 && 10); // 1
        printf("%d\n", 20 || 10); // 1
        return 0;
    }
    

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

    如果 JavaScript 的行为方式与 C 相同,那么表达式 "All" &amp;&amp; 10"All" || 10 将计算为布尔值 true。但是,这不是 JavaScript 中逻辑运算符的行为方式。这并不是说它们是错误的。

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

    JavaScript 的逻辑运算符并不总是像 C 那样计算为布尔值。相反,它们评估为它们的操作数之一。 &amp;&amp; 运算符在其为假时计算其左操作数。否则,它计算为正确的操作数。同样,|| 运算符在其为真时对其左操作数求值。否则,它的计算结果是正确的操作数。

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

    因此,不。 JavaScript 没有错误。

    【讨论】:

      【解决方案2】:

      我在这里引用官方文档:- Logical AND in JS

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

      让我们举几个例子,

      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时,JS解释器停止并返回第一个值。

      这是因为当 JS 解释器将第一个值转换为布尔值时,它评估为 false。我们知道“在任何&amp;&amp; 运算符上,如果单个值为false,它将返回false

      所以这里的 JS 解释器尝试通过返回 before 来节省一些计算能力,而不需要完整的语句评估。太棒了。

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

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 1970-01-01
        • 2011-07-02
        • 2021-11-08
        • 2011-01-02
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多