私はもともと、解決策は 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;
}