Switch-case для строк в Javascript не работает должным образом
Итак, у меня есть эта проблема со строками и коммутационным футляром, и я постараюсь сделать это как можно проще.
Здесь event.keyCode имеет значение "65" и является результатом события keydown "a" (с использованием JQuery).
if (event.keyCode == "65") {
alert("hmmmm");
}
Это работает, но:
switch (event.keyCode) {
case '65':
alert("Yay!");
break;
}
Это не так. Однако это будет работать:
switch ('65') {
case '65':
alert("Yay!");
break;
}
И если я это сделаю:
var t = '65';
switch (t) {
case '65':
alert("Yay!");
break;
}
Это работает. И затем я попробовал это:
var t = event.keyCode;
switch (t) {
case '65':
alert("Yay!");
break;
}
Но он терпит неудачу!
Итак, почему он соответствует в if-блоке в начале, но не для случая switch?
Ответы
Ответ 1
keyCode
- целое число, а не строка. Когда вы используете ==
, преобразование выполняется неявно. Однако коммутатор использует эквивалент ===
, который не допускает неявных преобразований. Вы можете легко проверить это:
switch (65) {
case '65':
alert("Yay!");
break;
}
Как и ожидалось, он не предупреждает.
Это указано в ECMAScript, пятое издание 12.11 (оператор switch). Интерпретатор будет вводить оператор case, если "input
равно clauseSelector
, как определено оператором ===". input
- 65 (целое число), а в нашем примере выше - "65" (строка), а не ===
.