2010-04-04 15 views
28

Also habe ich dieses Problem mit Strings und Switch-Case, und ich werde versuchen, es so einfach wie möglich zu halten.Switch-Case für Strings in Javascript funktioniert nicht wie erwartet

Hier hat event.keyCode den Wert "65" und ist das Ergebnis eines Keydown-Ereignisses von 'a' (mit JQuery).

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

Das funktioniert, aber:

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

Das ist nicht der Fall ist. Allerdings wird diese Arbeit:

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

Und wenn ich dies tun:

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

Es funktioniert. Und dann habe ich das versucht:

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

Aber es scheitert!

Also warum passt es im if-Block am Anfang, aber nicht für den Switch-Fall?

+0

Was ist Ihr Kontexttest? –

Antwort

58

keyCode ist eine Ganzzahl, keine Zeichenfolge. Wenn Sie == verwenden, wird die Konvertierung implizit durchgeführt. Der Switch verwendet jedoch das Äquivalent ===, das implizite Konvertierungen nicht zulässt. Sie können dies problemlos testen mit:

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

Wie erwartet, wird nicht gewarnt.

Dies wird in ECMAScript, 5. Ausgabe Abschnitt 12.11 (Switch-Anweisung) angegeben. Der Interpreter wird eine case-Anweisung eingeben, wenn "input gleich clauseSelector wie vom Operator === definiert ist". input ist 65 (integer) und clauseSelector ist '65' (string) in meinem obigen Beispiel, die nicht === sind.

+0

Sie haben Recht, ich bin es gewohnt, dass Dinge beim Vergleich (int == string) abstürzen. Vielen Dank! – Coltin

+1

'switch (event.keyCode.toString())' wird richtig machen? – GoodSp33d

+0

@ 2-Stroker, nur direkt auf die Nummer wechseln. Es kann auch schneller sein. –

Verwandte Themen