由于NaN === NaN
评估为false
,是否可以在NaN
语句中添加switch
个案?
例如,假设我想进行以下切换:
switch(x){
case 1:
case 2:
case 4:
doSomething();
break;
case NaN:
doSomethingElse();
break;
case default:
doADifferentThing();
break;
}
将NaN
作为x
发送将转至默认情况。我知道有很多方法可以在switch语句中使用NaN
(例如,我可以使用if..else
语句并使用isNaN
),但是有更直接的方法吗?
答案 0 :(得分:7)
我最初写道,我只看到了一个解决方案,但是在我睡觉的时候,我想出了一个极好的解决方案。
始终记住,交换机不进行隐式类型转换以比较这些情况,因此如果为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将返回true,如果x在哪里是一个字符串但是它并不重要,因为由于switch语句的上述行为,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;
}
Brad的解决方案:
对于这个人来说,这是布拉德。 我真的不喜欢这个,因为它感觉有点像黑客,也就是说,这不是你期望使用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;
}
答案 1 :(得分:2)
@ helmus的回答是正确的,是一个很好的解决方案。
但是,如果使用字符串,则可以保留NaN
大小写:
switch(x+''){
case "1":
case "2":
case "4":
doSomething();
break;
case "NaN":
doSomethingElse();
break;
default:
doADifferentThing();
break;
}
答案 2 :(得分:2)
为什么不简单地这样做(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;
}
答案 3 :(得分:0)
使用toString():
switch (x.toString()) {
case '1':
case '2':
case '4':
console.log('1/2/4');
break;
case 'NaN':
console.log('NaN');
break;
default:
console.log('default');
}