【问题标题】:JavaScript type conversion: (true && 1) vs (true | | 1)JavaScript 类型转换:(true && 1) vs (true | | 1)
【发布时间】:2012-01-23 12:00:00
【问题描述】:

JavaScript 是非严格类型的语言,例如 Java。

我们知道,它根据上下文转换结果的值:

"2" + "3" 结果"23"

"2" * "3" 结果6

这个比较清楚,可以理解。

我只是尝试了以下表达式并感到困惑:

true && 1 结果1
true || 1 结果true

为什么第一个给出数字,第二个给出布尔值?

考虑到 JavaScript 转换规则,由于 boolean 表达式的上下文,我希望在这两种情况下都得到 boolean 值。

【问题讨论】:

    标签: javascript numbers boolean type-conversion


    【解决方案1】:

    检查Douglas Crockford's site,上面写着:

    && 运算符通常称为逻辑与。它也可以称为 警卫。如果第一个操作数为 false、null、未定义,“”(空 string) 或数字 0 则返回第一个操作数。否则, 它返回第二个操作数。这提供了一种方便的编写方式 空检查:

    var value = p && p.name; /* The name value will only be retrieved from
    p if p has a value, avoiding an error. */
    

    ||运营商通常是 称为逻辑或。它也可以称为默认值。如果第一个操作数 为 false、null、未定义、""(空字符串)或数字 0, 然后它返回第二个操作数。否则,它返回第一个 操作数。这提供了一种指定默认值的便捷方式:

    value = v || 10; /* Use the value of v, but if v doesn't have a value,
    use 10 instead. */
    

    【讨论】:

    • 感谢您的解释 - 关于守卫和默认值很有趣
    • 不客气。总而言之,我建议阅读 Douglas 的 JavaScript 页面而不是规范。在我看来,这更容易理解。 javascript.crockford.com
    • 很好的解释!我希望我能给你 +3。
    • @OldPro 非常感谢,但应归功于道格拉斯·克罗克福德的功劳。
    【解决方案2】:

    quote MDC

    &&; 如果expr1可以转换为false则返回;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。
    ||;如果可以转换为 true,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,||如果任一操作数为真,则返回真;如果两者都是 false,则返回 false。

    所以在第一个示例中,1 被返回,因为 expr1 无法转换为 false。

    在第二个示例中,true 可以转换为 true,因此返回。

    【讨论】:

    • 非常感谢,其实你提醒我,Mozilla 资源作为 JavaScript 文档非常有价值
    【解决方案3】:

    这与类型转换无关。

    || 返回第一个真值操作数。 1 || true 会给你1

    && 返回第一个假操作数,如果两者都为真,则返回第二个操作数。

    ECMAScript specification第58页

    【讨论】:

      【解决方案4】:

      true && 1 => 如果所有条件都为真或假,这将始终返回 && 的最后一个值

      true || 1 => 这将始终返回第一个“真实”值

      资源:

      http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

      【讨论】:

        【解决方案5】:

        你也可以做其他事情,比如:

        var myVar = Math.random() > 0.5;
        
        myVar && doFunc();
        

        相同
        if(myVar) {
            doFunc();
        }
        

        || 的基本意思是“如果第一件事是假的,那就去第二件事”

        && 的基本意思是“如果第一件事是真的,就去做第二件事”

        这就是为什么你会在函数顶部看到这样的东西:

        function myFunction(options) {
            options = options || {};
        }
        

        这意味着:如果选项是错误的,则将其设为{}

        【讨论】:

          【解决方案6】:

          您将强制转换(* / + 运算符将执行此操作)与逻辑评估(其中 &&,||)混淆。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            相关资源
            最近更新 更多