Таким образом, у меня есть эта проблема со строками и случаем переключателя, и я попытаюсь сохранить его максимально простым.
Здесь event.keyCode имеет значение "65" и является результатом keydown события (использование 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;
}
Но это перестало работать!
Итак, почему это соответствует в если-блоке вначале, но не для случая переключателя?
keyCode
является целым числом, а не строкой. Когда вы используете ==
, преобразование выполняется неявно. Однако переключатель использует эквивалент ===
, который не допускает неявных преобразований. Вы можете легко это проверить с помощью:
switch (65) {
case '65':
alert("Yay!");
break;
}
Как и ожидалось, он не выдает предупреждения.
Об этом говорится в ECMAScript , 5-е издание, раздел 12.11 (оператор переключения). Интерпретатор введет оператор case, если « input
равен clauseSelector
, как определено оператором ===». input
- 65 (целое число), а clauseSelector - '65' (строка) в моем примере выше, что не является ===
.