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?
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 ===
.