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