我最初写道我只看到了一个解决方案,但是在我睡觉时我想出了一个极好的解决方案。
请始终记住,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;
}
如果 x 是字符串,则 isNaN 将返回 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;
}
布拉德的解决方案:
感谢布拉德的这一点。
我不太喜欢这个,因为它感觉有点像黑客,也就是说,这不是您期望使用 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;
}