web-dev-qa-db-fra.com

Switch-Case pour les chaînes en Javascript ne fonctionne pas comme prévu

J'ai donc ce problème avec les chaînes et le boîtier de commutateur, et je vais essayer de le garder aussi simple que possible.

Ici, event.keyCode a la valeur "65" et est le résultat d'un événement keydown de 'a' (en utilisant JQuery).

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

Cela fonctionne, mais:

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

Ce n'est pas le cas. Cependant, cela fonctionnera:

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

Et si je fais ça:

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

Ça marche. Et puis j'ai essayé ceci:

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

Mais ça échoue!

Alors, pourquoi correspond-il dans le bloc if au début, mais pas pour le boîtier de commutation?

28
Coltin

keyCode est un entier, pas une chaîne. Lorsque vous utilisez ==, la conversion se fait implicitement. Cependant, le commutateur utilise l'équivalent de ===, qui n'autorise pas les conversions implicites. Vous pouvez le tester facilement avec:

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

Comme prévu, il n'alerte pas.

Ceci est indiqué dans ECMAScript , 5ème édition section 12.11 (instruction switch). L'interpréteur entrera une instruction case si "input est égal à clauseSelector tel que défini par l'opérateur ===". input est 65 (entier) et clauseSelector est '65' (chaîne) dans mon exemple ci-dessus, qui ne sont pas ===.

58
Matthew Flaschen