JS中switch的四种写法示例

JS中switch的四种写法示例

本文主要介绍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写作的更多信息,请关注我们的其他相关文章!

JS中switch的四种写法示例