Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

keyCode - целое число, а не строка. Когда вы используете ==, преобразование выполняется неявно. Однако коммутатор использует эквивалент ===, который не допускает неявных преобразований. Вы можете легко проверить это:

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

Как и ожидалось, он не предупреждает.

Это указано в ECMAScript, пятое издание 12.11 (оператор switch). Интерпретатор будет вводить оператор case, если "input равно clauseSelector, как определено оператором ===". input - 65 (целое число), а в нашем примере выше - "65" (строка), а не ===.