2013-09-30 55 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屬性值和第二個字符串,這就解釋了你得到的結果。