【问题标题】:Javascript how to use the and/or operator with parenthesisJavascript如何使用带括号的和/或运算符
【发布时间】:2013-10-06 00:19:01
【问题描述】:

我有一个对象,它在属性hello 中包含一个字符串HelloWorld。我想检查两个字符串,如果它与任何一个都不匹配,那么我想执行某些代码。

var item = { hello: "HelloWorld" }
item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld" // false, correct

不过,我觉得这可以优化并提高可读性:

item.hello !== ("GoodbyeWorld" && "HelloWorld") // false, correct
item.hello !== ("HelloWorld" && "GoodbyeWorld") // true   WTF?

我预计这两个检查都是虚假的,但我肯定在这里遗漏了一些东西。我认为我对 javascript 中的 AND/OR 运算符没有正确的理解,或者我以错误的方式使用了括号。谁能解释一下?

JSFiddle example

【问题讨论】:

标签: javascript operators or-operator


【解决方案1】:

"HelloWorld" && "GoodbyeWorld" 的结果是 "GoodbyeWorld" 这就是为什么你会得到你现在的结果,你之前的做法是最简单的解决方案

【讨论】:

  • "HelloWorld" && "GoodbyeWorld" 的结果是"GoodbyeWorld":谢谢,我没有意识到。太糟糕了,没有办法简化它。
【解决方案2】:

我们来看看这一行

item.hello !== ("HelloWorld" && "GoodbyeWorld") // true WTF?

如果lVal 是真值,则逻辑AND 运算符会计算其右操作数。

注意,真值是所有非假值 (null,false,0,"",undefined,NaN)

因为"HelloWorld"确实是真的

表达式("HelloWorld" && "GoodbyeWorld") 的计算结果为"GoodbyeWorld",您正在有效地进行比较

item.hello !== "GoodbyeWorld" 可以简化为"HelloWorld" !== "GoodbyWorld"

因此,是true


但是,如果您使用的是 ES5 兼容环境,则可以使用 Array.prototype.indexOf 来简化它。

!~["HelloWorld","GoodbyWorld"].indexOf(item.hello) //false

如果 item.hello 不包含在数组中,则上述返回 true

【讨论】:

    【解决方案3】:

    不,您不能以这种方式优化表达式。您正在做的是消除其中一个字符串,因此您只进行其中一个比较。

    && 运算符使用短路求值,这意味着如果第一个操作数为真,它将只返回第二个操作数。

    因此,您的代码所做的是将 hello 属性值与第二个字符串进行比较,这解释了您得到的结果。

    【讨论】:

      【解决方案4】:
      item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld"
      

      是测试item.hello 是否不同于"HelloWorld""GoodbyeWorld" 的正确方法。

      JavaScript 中的表达式A && B 会产生AB 的结果,这就是与您的item.hello 比较的结果。

      【讨论】:

        猜你喜欢
        • 2021-01-09
        • 1970-01-01
        • 2021-10-22
        • 2014-10-16
        • 2014-11-13
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 2012-10-01
        相关资源
        最近更新 更多