2013-06-19 118 views
2

我想leanr一些JavaScript,但我不能完全回答爲什麼:控制檯日誌,如果,奇怪的行爲

var a = 'xyz'; 
console.log('Example: ' + (a === 'xyz') ? 'A' : 'B'); 

給我回「A」,而不是實例:A.然而,當我把整個如果這樣:

var a = 'xyz'; 
console.log('Example: ' + ((a === 'xyz') ? 'A' : 'B')); 

它的工作完美無瑕。這是否意味着第一個將'Example:'字符串放在邏輯+中,並且這個if?

回答

7

這不是一個if聲明,它是一個三元運算符。

但從根本上講,是的,正在發生的事情是,首先這部分evaluted:

(a === 'xyz') 

...併成爲truefalse。那麼這樣做(讓我們假設true):

'Example: ' + true 

...導致:

'Example: true' 

...那麼這樣做:

'Example: true' ? 'A' : 'B' 

...這給我們'A',因爲字符串不是空白的,所以它是真的。

這是因爲+具有比三元(? :)更高的優先級。

+0

相當完整的答案+1。 – g00glen00b

+0

非常好的答案。有關第一行代碼的確切答案。當使用三重等號時,它正在計算一個布爾值。因此,它尋找'(a === true)'或'(a === false)'。在這種情況下,應該使用'=='。 – Mic1780

+0

@ Mic1780:結果是一種布爾方式。 '=='只是增加了類型強制。在OP的例子中,使用'=='和'==='之間沒有什麼區別,因爲'a'和''xyz''都是字符串。*「因此,它尋找'(a === true)'或'(a === false)'」*不,那種比較永遠不會完成。 –

1

如果沒有掀起(a === 'xyz') ? 'A' : 'B'帶括號,JS引擎會優先向+操作並解釋你的truthy測試爲'Example: ' + (a === 'xyz'),從而返回A.

這將返回即使相等測試是假,因爲與truefalse連接的字符串仍然爲真。