本文主要介绍JS中switch的四个编写实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
目录
简介开关通用写开关简单写寿命封装策略
引言
JavaScript switch有四种写法,你知道吗?你知不知道,反正我也不知道。
据我所知,JavaScript的switch语句只有一种写法。但是说到处理分支,有很多种写法。如果分支写可以是一种类型,切换分支写可以是第二种类型,第三种类型就是使用策略模式。如果你想包含条件操作符,那么,只有四种类型。
switch一般写法
但是,这篇文章的主角是switch。大家都知道switch的写法一般是switch变量或者表达式,case常量。嗯,举个100分的例子,90分及以上算优秀,80分及以上但90分以下算好,60分及以上但80分以下算合格,60分以下算不合格。用switch大概会写成这样:
函数计算等级(分数){
const line=score/10 | 0;
开关(线路){
案例10:案例9:
返回‘优秀’;
案例8:
返回‘好’;
案例7:案例6:
返回“合格”;
默认值:
返回‘不合格’;
}
}
代码score/10 | 0和Math.floor(score/10)的作用相同,即除以10得到商的整数部分。
这一段switch还是比较令人满意的,巧妙的使用了四舍五入,避免使用一长串if.else分支。
但是现在规则变了,合格和良好的分界点从80分降到了75分。我该怎么办?
按照上面的舍入方法还是可以的,只是这次除数不再是10,而是5。相应地,有更多情况:
18、19、20为优秀,15、16、17为良好,12、13、14为合格,其余为不合格。
写9格,最好用if.否则。
switch简单写法
是吗?实际上,用switch编写它有一个更简单的方法:
函数计算等级(分数){
开关(真){
案例得分=90:
返回‘优秀’;
案例得分=75:
返回‘好’;
案例得分=60:
返回“合格”;
默认值:
返回‘不合格’;
}
}
是不是感觉很奇怪?这根本不是通常的switch表达式case常量,而是相反的,switch常量case表达式!如果你运行这个程序,你会发现一点问题都没有。因为——switch 和 case 是按===来匹配的,它不在乎是表达式还是常量。换句话说,switch和case后面都可以跟一个表达式!
对,表情!
因此,在上面的示例中,将switch(true)更改为switch( 2 1)具有相同的效果。
好了,脑洞已经开了。switch有多少种写法并不重要。接下来要研究的是switch的变种。
IIFE 封装
看到C#有switch表达式,我就贪心了。能实现吗?
不要贪心,JavaScript里的一切都可以是表达式.如果没有,就用生命封装一个。
函数计算等级(分数){
return(值={
开关(真){
案例值=90:
返回‘优秀’;
案例价值=75:
返回‘好’;
案例价值=60:
返回“合格”;
默认值:
返回‘不合格’;
}
})(分数);
}
注意这里用的是score作为IIFE的参数,因为实际使用中可能需要传入一个表达式。在这种情况下,应该提前评估,并且只评估一次(以避免替代的副作用)。
封成策略
但是,这样的封装显然没有意义。如果真的要这样封装,不如封装成一个策略:
函数计算等级(分数){
return((值,规则)=gtrules . find(({ t })=gt;t(值))。五)(
分数,
[
{ t:n=gt;n gt=90,v:'优秀' },
{ t:n=gt;n gt=75,v:'好' },
{ t:n=gt;n gt=60,v:'合格' },
{ t:()=gt;真,v:'不合格' },
]
);
}
每个策略都是一个带有测试者(t)和值(v)的对象。Tester是一个判断函数,传入的是要判断的值,也就是这里的表达式switch(表达式),这个表达式也是提前赋值后作为IIFE的参数传入的。应用策略的过程简单粗暴,就是找到第一个合格的策略,把它的价值拿出来。
当然,这个策略有点大材小用。真正需要一个策略的时候,通常不是一个价值观,而是一种行为,也就是一种功能。
我们知道在switch语句中,每个case都在相同的范围内,所以我们不能在两个case语句中声明相同的局部变量。虽然用{}包装可以解决这些问题,但是代码不好看,特别要注意别忘了破。用策略的话,可能看着顺眼,也不用担心破的问题:
这里演示一下,先输出结果,再返回成绩。
函数计算等级(分数){
return ((value,rules)=rules . find(({ t })=t(value))。fn(值))(
分数,
[
{
t: n=n=90,
fn:分数={
Const grade='优秀';
console.log(等级,分数);
返回等级;
}
},
{
t: n=n=75,
fn:分数={
Const grade='好';
console.log(等级,分数);
返回等级;
}
},
{
t: n=n=60,
fn:分数={
Const grade='合格';
console.log(等级,分数);
返回等级;
}
},
{
t: ()=真,
fn:分数={
常量等级='不合格';
console.log(等级,分数);
返回等级;
}
},
]
);
}
代码确实有点长,因为里面有策略行为逻辑。如果真的要当交换机表达式用,策略部分应该是个表达式,不会太长。在上面的代码中,策略行为是相似的,并且可以封装到一个函数中,因此它可以以表达式的形式编写:
函数计算等级(分数){
const printGrade=(成绩,分数)={
console.log(等级,分数);
返回等级;
};
return ((value,rules)=rules . find(({ t })=t(value))。fn(值))(
分数,
[
{t: n=n=90,fn: score=printGrade('优秀',分数)},
{t: n=n=75,fn: score=printGrade('好',分数)},
{t: n=n=60,fn: score=printGrade('合格',分数)},
{t: ()=true,fn: score=printGrade('不合格',score)},
]
);
}
现在看起来体面吗?
上面的代码是不同的形式,做着同样的事情,没有谁优谁劣的比较。看着顺眼就是高雅,看着不讨人喜欢就是不受宠。在不同的情况下,选择合适的方法是有好处的。上面的代码使用find()来查找策略。如果用filter()代替,那就另当别论了。
以上是JS switch的四个编写实例的细节。关于JS switch写作的更多信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。