web-dev-qa-db-ja.com

Javascriptの文字列のスイッチケースが期待どおりに機能しない

そのため、文字列とスイッチケースでこの問題が発生します。可能な限りシンプルに保つようにします。

ここで、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-blockで最初に一致しますが、switch-caseでは一致しないのですか?

28
Coltin

keyCode は文字列ではなく整数です。 ==を使用すると、変換は暗黙的に行われます。ただし、スイッチは===に相当するものを使用するため、暗黙的な変換は許可されません。これを簡単にテストできます:

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

予想どおり、アラートは発生しません。

これは ECMAScript 、第5版セクション12.11(switchステートメント)に記載されています。インタープリターは、「inputが===演算子で定義されたclauseSelectorと等しい場合」にcaseステートメントを入力します。上記の例では、inputは65(整数)で、clauseSelectorは '65'(文字列)です。これらは===ではありません。

58