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 switch-case, et je vais essayer de le garder aussi simple que possible.

Ici événement.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;
}

Cela ne fonctionne pas. cependant, cela fonctionnera:

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

Et si je fais ceci:

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 cas de commutateur?

28
demandé sur Coltin 2010-04-04 04:36:45

1 réponses

keyCode est un entier, pas une chaîne de caractères. Lorsque vous utilisez ==, la conversion est effectuée implicitement. Cependant, le commutateur utilise l'équivalent de ===, ce qui n'autorise pas les conversions implicites. Vous pouvez tester cela 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 à {[5] } 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
répondu Matthew Flaschen 2010-04-04 00:58:53