Javascript 如何在switch语句中使用NaN case?
由于Javascript 如何在switch语句中使用NaN case?,javascript,Javascript,由于NaN===NaN的计算结果为false,是否可以将NaN大小写添加到开关语句中 例如,假设我要进行以下切换: switch(x){ case 1: case 2: case 4: doSomething(); break; case NaN: doSomethingElse(); break; case default: doADifferentThing();
NaN===NaN
的计算结果为false
,是否可以将NaN
大小写添加到开关
语句中
例如,假设我要进行以下切换:
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
),但是有没有更直接的方法呢?我最初写过一篇文章,我只看到了一个解决方案,但在睡觉时我想出了一个极好的解决方案
请始终记住,开关不会进行隐式类型转换来比较大小写,因此,如果为开关语句提供字符串,则它将不会与大小写中的整数匹配,反之亦然。
如果要与字符串和整数进行比较,必须先将整数转换为字符串,然后仅与字符串进行比较
卓越的解决方案:
正如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;
}
我最初的方法是:
如果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;
}
@赫尔姆斯的回答是正确的,是一个很好的解决方案 但是,如果使用字符串,则可以维护
NaN
案例:
switch(x+''){
case "1":
case "2":
case "4":
doSomething();
break;
case "NaN":
doSomethingElse();
break;
default:
doADifferentThing();
break;
}
您可以这样做():
或者,如果还希望验证包含数字()的字符串:
使用toString():
我认为唯一的方法是使用
case x==1
和case isNaN(x)
语句切换(true)。这不是最理想的结构,但确实有效。您可以在默认情况下执行isNan,并根据每个其他可能的x
值放置case
块来更改逻辑,然后default
将为NaN
:)只要您知道x
不是null
或未定义
,这就行了。你可以用x+“”
来代替……从技术上讲,NaN!==“NaN”
.Oops,只是又一次可能的破损。如果它是数组中的一个数字,如[1]
,字符串转换将为“1”。我想这取决于OP想要什么样的强迫,如果有的话。switch
语句是一个严格的比较语句,因此可能不需要强制值。如果x包含字符串“NaN”,这将解析为错误case@josh3736我知道,这就是我将x
和所有大小写转换为字符串的原因。然后比较将是“NaN”==“NaN”
对不起,但是当您将数字作为字符串传递时,超级解决方案将失败:var x=“1”
看到这个@wouther,这是switch语句的预期行为,它不会进行隐式转换,就像我在帖子中明确指出的那样,请查看这个jsFiddle以证明x=“1”
我希望它发出警报1
或IsNaN
,但不是默认值
@wouther这是javascript开关语句的工作方式,所以正如预期的那样,但您的解析方法确实提供了一个可能有用的额外功能哦,伙计,它看起来棒极了。但同时,我绝不允许类似的东西通过代码审查:)非常好的建议,我优化了它,并将其包含在我的帖子中!
switch(x+''){
case "1":
case "2":
case "4":
doSomething();
break;
case "NaN":
doSomethingElse();
break;
default:
doADifferentThing();
break;
}
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;
}
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;
}
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');
}