2013-09-30 35 views
3

我有一个对象在属性hello中包含字符串HelloWorld。我想检查两个字符串,如果它不匹配任何一个,那么我想执行某些代码。Javascript如何使用带括号的运算符和/或运算符

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

不过,我觉得这可以优化并使其更加易读:

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

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

JSFiddle example

+3

你不能这样做。我想不出一种支持这种构造的单一语言。有关更详细的解释,请参阅http://stackoverflow.com/a/17200368/146205。 – Jensen

回答

3

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

+0

“HelloWorld”&&“GoodbyeWorld”的结果是“GoodbyeWorld”:谢谢,我没有意识到。太糟糕了,没有办法简化它。 –

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

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

JavaScript中的表达式A && B产生的结果为AB,它的结果与item.hello相比较。

3

让我们来看看这条线

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

逻辑AND运算符评估其右操作数,如果lVal是真值。

注意,一个truthy值是每一个这是不falsy值(null,false,0,"",undefined,NaN

由于"HelloWorld"确实truthy

表达("HelloWorld" && "GoodbyeWorld")计算为"GoodbyeWorld"和你比较有效

item.hello !== "GoodbyeWorld"其中可以减少到"HelloWorld" !== "GoodbyWorld"

Henc E,是true


但是,如果你在一个ES5兼容的环境中,可以使用Array.prototype.indexOf简化它。

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

上述返回true如果item.hello不包含在阵列

1

否,则不能最优化表达的方式。你正在做的是消除其中一个字符串,所以你只做一个比较。

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

因此,你的代码正在做的是比较hello属性值和第二个字符串,这就解释了你得到的结果。