【问题标题】:Logical operators and their behavior in JavaScriptJavaScript 中的逻辑运算符及其行为
【发布时间】:2015-03-09 14:35:45
【问题描述】:

为什么会失败?

我阅读这段代码的方式是“如果 a 或 b 或 c 等于三,则该语句为真”。但显然 JavaScript 不同意。为什么?

function test() {

    var a = 'one';
    var b = 'two';
    var c = 'three';

    return ( ( a || b || c ) === 'three' );

}

编辑:我知道我需要分别评估每个表达式,但正在寻找一种更快的方法来编写它。欢迎提出任何建议。

【问题讨论】:

    标签: javascript jquery logic operators logical-operators


    【解决方案1】:

    您对代码的阅读不正确。翻译成另一种形式:

    if (a) {
      return a === "three";
    }
    if (b) {
      return b === "three";
    }
    if (c) {
      return c === "three";
    }
    

    子表达式(a || b || c) 返回abc 中不是“虚假”的第一个。那是a,因为它的值是"one",所以这是与"three"相比的总体值。

    【讨论】:

    • 感谢您的解释。现在这是有道理的。反正有没有实现类似于我发布的东西?我知道我需要分别评估每个表达式,但正在寻找一种更快的方法来编写它。欢迎提出任何建议。
    • @goodpixels 好吧,没有办法做到这一点,这不是有点笨拙。您必须对每一个进行明确的比较。我想您可以将它们包装在一个数组中,然后使用 .indexOf() 但这似乎很笨拙且不太明显。
    【解决方案2】:

    表达式( a || b || c ) 在先到先得的基础上返回任何真实的内容。 这里a 是真实的,因此被使用。如果afalsey,则将使用b。如果它也是 falsey,则将使用c

    因此,您总是会比较 "one" == "three",因为字符串被认为是真实的。在这种情况下,您可以使用Array.some,用您的话来说,它会按照您的意愿或您希望它的行为方式进行操作

    “如果 a 或 b 或 c 等于三,则该陈述为真”

    return [a,b,c].some(function(str){
       return str == "three";
    });
    

    【讨论】:

      【解决方案3】:

      计算结果为 a、b 或 c(将是真或假)“三”的字符串等价物。这将永远是错误的。 为了达到你想要的,你需要

      return (a === 'three') || (b === 'three') || (c === 'three');
      

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2017-05-03
        • 1970-01-01
        • 2013-06-01
        • 2020-10-02
        • 1970-01-01
        相关资源
        最近更新 更多