2010-04-04 6 views
28

Así que tengo este problema con las cadenas y la caja del conmutador, y trataré de mantenerlo lo más simple posible.Switch-Case para cadenas en Javascript no funciona como se esperaba

Aquí event.keyCode tiene el valor "65" y es el resultado de un evento de selección de teclas de "a" (usando JQuery).

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

que funciona, pero:

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

Eso no lo hace. Sin embargo esto funcionará:

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

Y si hago esto:

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

funciona. Y luego probé esto:

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

¡Pero falla!

Entonces, ¿por qué coincide en el bloque if al principio, pero no para el switch-case?

+0

¿Cuál es su contexto de prueba? –

Respuesta

58

keyCode es un número entero, no una cadena. Cuando usa ==, la conversión se realiza implícitamente. Sin embargo, el interruptor usa el equivalente de ===, que no permite conversiones implícitas. Puede probar esto fácilmente con:

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

Como era de esperar, no alerta.

Esto se indica en ECMAScript, 5ª edición sección 12.11 (declaración de cambio). El intérprete ingresará una declaración de caso si "input es igual a clauseSelector como lo define el operador ===". input es 65 (entero) y clauseSelector es '65' (cadena) en mi ejemplo anterior, que no son ===.

+0

Tienes razón, estoy acostumbrado a que las cosas se cuelguen cuando comparo (int == cadena). ¡Gracias! – Coltin

+1

'switch (event.keyCode.toString())' va a hacer ¿verdad? – GoodSp33d

+0

@ 2-Stroker, simplemente cambie directamente en el número. Puede ser más rápido también. –

Cuestiones relacionadas