11

NaN === NaNは に評価されるので、ステートメントにケースをfalse追加することは可能ですか?NaNswitch

たとえば、次のスイッチを作成したいとします。

switch(x){
    case 1:
    case 2:
    case 4:
        doSomething();
        break;
    case NaN:
        doSomethingElse();
        break;
    case default:
        doADifferentThing();
        break;
}

NaNとして送信xすると、デフォルトのケースになります。NaNswitch ステートメントでの使用を回避する方法があることは知っていますが(たとえば、if..elseステートメントで囲んで use を使用できますisNaN)、もっと直接的な方法はありますか?

4

4 に答える 4

14

私はもともと、解決策は 1 つしかないと書いていましたが、睡眠中に素晴らしい解決策を思いつきました。

switch は大文字と小文字を比較するために暗黙的な型変換を行わないことに常に注意してください。そのため、switch ステートメントに文字列を指定すると、大文字と小文字の整数に一致しません。また、その逆も同様です。文字列と整数を比較したい場合は、最初に整数を文字列にキャストしてから、文字列のみと比較する必要があります。

優れたソリューション:

WouterH が指摘したように、数値を含む文字列を使用すると、私の最初の解決策はデフォルトに解決されます。これは、switch ステートメントの予想される動作です。しかし、これを克服するために引数を解析することが役立つ場合があります。そのために、次のコードを使用できます。

var x = "1";
switch (isNaN(x) || parseInt(x))
{
    case true:
      alert("IsNaN!") 
      break; 
    case 1: 
      alert("1"); 
      break; 
    case 2: 
      alert("2"); 
      break; 
    case 4: 
      alert("4"); 
      break; 
    default: 
      alert("default"); 
      break; 
}

私の最初の素晴らしい方法

var x = "clearly not a number";
switch(x){
    case !isNaN(x) || x:
      alert("IsNaN!")
      break;
    case 1:
      alert("1");
      break;
    case 2:
      alert("2");
      break;
    case 4:
      alert("4");
      break;
    default:
      alert("default");
      break;
    }

isNaN は、x が文字列である場合に true を返しますが、上記の switch ステートメントの動作により、true は文字列に対して true として評価されないため、実際には問題ではありません。

私の元の解決策:

私は何を考えていたのかさえわかりません。

var x = "clearly not a number";
switch(x){
    case 1:
      alert("1");
      break;
    case 2:
      alert("2");
      break;
    case 4:
      alert("4");
      break;
    case default:
       if (isNaN(x)){
          alert("isNaN");
          break;
       }
       alert("default");
       break;
}

ブラッドの解決策:

これについてはブラッドにthx。ハックのように感じるので、これはあまり好きではありません。つまり、これは case ステートメントの使用方法として期待されるものではありませんが、最も柔軟性が高いので、確実に使用できます。そのユースケースです。

var x = "clearly not a number";
switch(true)
{
   case x==1:
      alert("1");
      break;
   case x==2:
      alert("2");
      break;
   case IsNaN(x):
      alert("IsNaN");
      break;
   case default:
      alert("default");
      break;
}
于 2012-07-25T20:58:01.190 に答える
3

これを行うことができます(jsFiddle):

var x = "test";
switch (isNaN(x) || x)
{
    case true:
      alert("IsNaN!") 
      break; 
    case 1: 
      alert("1"); 
      break; 
    case 2: 
      alert("2"); 
      break; 
    case 4: 
      alert("4"); 
      break; 
    default: 
      alert("default"); 
      break; 
}

または、数値を含む文字列も検証したい場合 ( jsFiddle ):

var x = "1";
switch (isNaN(x) || parseInt(x))
{
    case true:
      alert("IsNaN!") 
      break; 
    case 1: 
      alert("1"); 
      break; 
    case 2: 
      alert("2"); 
      break; 
    case 4: 
      alert("4"); 
      break; 
    default: 
      alert("default"); 
      break; 
}
于 2012-08-09T20:33:53.660 に答える
2

@helmusの答えは正しく、良い解決策です。

ただし、NaN文字列を使用する場合は、大文字と小文字を区別できます。

switch(x+''){
    case "1":
    case "2":
    case "4":
        doSomething();
        break;
    case "NaN":
        doSomethingElse();
        break;
    default:
        doADifferentThing();
        break;
}
于 2012-07-25T21:01:06.273 に答える