2014-05-07 72 views
0

我在我的JavaScript設置一個斷點,我鍵入下面的表達式到Chrome瀏覽器控制檯窗口:串連`:`條件字符串在JavaScript

類型的:

(((i % 12) == 0) ? '12' : (i % 12)) 

結果:

9 

類型的:

' ' + (i < 12) ? 'AM' : 'PM' 

結果:

"AM" 

類型的:

(((i % 12) == 0) ? '12' : (i % 12)) + ' ' + (i < 12) ? 'AM' : 'PM' 

結果:

"AM" 

我的期望是,最後的結果將是 「上午9點」,這是我想要的。如果我輸入9 + "AM",那就是我得到的結果。爲什麼只給我「AM」?

我在這裏犯了一個愚蠢的錯誤,還是有什麼東西超出了我對JavaScript內部工作的有限理解? i只是一個for循環變量。

+0

不恰當地使用條件運算符,還要檢查truthy和falsey的值 - http://james.padolsey.com/javascript/truthy-falsey/ – adatapost

回答

1

裹在括號中的第二三元和它的工作原理:

(((i % 12) == 0) ? '12' : (i % 12)) + ((i < 12) ? 'AM' : 'PM') 
0

試試這一個。把支架,你決定上午或下午

var a = (((i % 12) == 0) ? '12' : (i % 12)) + ' ' + ((i < 12) ? 'AM' : 'PM'); 

這裏是工作 http://jsfiddle.net/fLXr9/

3

(((i % 12) == 0) ? '12' : (i % 12)) + ' ' + (i < 12) ? 'AM' : 'PM'

因爲之前的所有的的jsfiddle?被強制爲布爾值。

究竟去之前是字符串'9 true'這是從與空間連接起來的第一三字母9,然後,因爲(我< 12)是真實的,但它是在一個字符串上下文(我< 12)被脅迫「真正'。

當強制爲布爾值時,此字符串爲真,因爲它非空。

3

問題是你認爲你連接的部分實際上是作爲後一個三元條件的一部分。具體地,以所述第一三元的後面部分,您的表達式相當於

(i % 12) + ' ' + (i < 12) ? 'AM' : 'PM'` 

條件部分,(i % 12) + ' ' + (i < 12)評估爲「9真」,這是一個truthy結果。因爲它真的很好,所以返回的結果是「AM」; 「9」將作爲條件的一部分進行評估,而不是按照您的意圖進行連接。

因此,解決的辦法是基團的最後一個比特,以正確地隔離三元結果:

((i < 12) ? 'AM' : 'PM') 

的更新的代碼變爲:

(i % 12 == 0 ? '12' : i % 12) + ' ' + (i < 12 ? 'AM' : 'PM') 
1

這也將工作:d

var a = (((i % 12) == 0) ? '12' : (i % 12)); 
var b = (i < 12) ? 'AM' : 'PM'; 
var output = a + b;