Javascript如何使用带括号的和/或运算符

时间:2013-09-30 07:53:44

标签: javascript operators or-operator

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

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

4 个答案:

答案 0 :(得分:3)

"HelloWorld" && "GoodbyeWorld"的结果是"GoodbyeWorld"这就是为什么你得到的结果,你以前的方式是最简单的解决方案

答案 1 :(得分:3)

我们来看看这一行

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

答案 2 :(得分:1)

item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld"

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

JavaScript中的表达式A && B会产生AB的结果,并且该结果与您的item.hello进行比较。

答案 3 :(得分:1)

不,你不能那样优化表达。你正在做的是消除其中一个字符串,这样你只进行了一次比较。

&&运算符使用短路评估,这意味着如果第一个操作数是真实的,它将只返回第二个操作数。

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