2010-04-04 28 views
28

所以我有這個問題的字符串和開關大小寫,我會盡量保持它儘可能簡單。在Javascript中的字符串切換案例沒有按預期工作

這裏event.keyCode的值是「65」,並且是'a'的keydown事件(使用JQuery)的結果。

if (event.keyCode == "65") { 
    alert("hmmmm"); 
} 

這樣的作品,但:

switch (event.keyCode) { 
    case '65': 
     alert("Yay!"); 
     break; 
} 

不。然而,這將工作:

switch ('65') { 
    case '65': 
     alert("Yay!"); 
     break; 
} 

如果我這樣做:

var t = '65'; 
switch (t) { 
    case '65': 
     alert("Yay!"); 
     break; 
} 

它的工作原理。然後我試過這個:

var t = event.keyCode; 
switch (t) { 
    case '65': 
     alert("Yay!"); 
     break; 
} 

但它失敗!

那麼爲什麼它在if-block中匹配開頭,而不是開關case?

+0

什麼是你的上下文測試? – 2010-04-04 00:41:45

回答

58

keyCode是一個整數,而不是一個字符串。當您使用==時,轉換是隱式完成的。但是,交換機使用等效於===,不允許隱式轉換。您可以使用以下方式輕鬆測試:

switch (65) { 
    case '65': 
     alert("Yay!"); 
     break; 
} 

正如預期的那樣,它不會提示。

這是在ECMAScript,第5版第12.11節(轉換語句)中陳述的。如果「input等於012 ====」(由===運算符定義),解釋器將輸入一個案例聲明。 input是65(整數),在我上面的例子中,clauseSelector是'65'(字符串),它不是===

+0

你說得對,我比較習慣崩潰(int == string)。謝謝! – Coltin 2010-04-04 00:42:34

+1

'switch(event.keyCode.toString())'會做對嗎? – GoodSp33d 2013-05-03 05:35:33

+0

@ 2-Stroker,只需直接切換號碼。它可能也更快。 – 2013-05-03 08:05:55