Switch-Case для строк в Javascript не работает должным образом - PullRequest
28 голосов
/ 04 апреля 2010

Итак, у меня есть проблема со строками и переключателем, и я постараюсь сделать это как можно проще.

Здесь event.keyCode имеет значение «65» и является результатом события нажатия клавиши «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 в начале, но не для переключателя?

1 Ответ

58 голосов
/ 04 апреля 2010

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

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

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

Это указано в ECMAScript , 5-е издание, раздел 12.11 (оператор switch). Интерпретатор введет регистр, если «input равно clauseSelector, как определено оператором ===». input равно 65 (целое число), а clauseSelector равно '65' (строка) в моем примере выше, что не ===.

...