javascript中switch用法,switch语句的写法

  javascript中switch用法,switch语句的写法

  本文给大家带来了一些关于javascript的知识,主要梳理了switch的四种编写方法,包括生命封装、密封策略等等。下面就来看看吧,希望对你有帮助。

  【相关推荐:javascript视频教程,web前端】

  

引言

   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:分数={

  Const grade=不合格;

  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()代替,那就另当别论了。

  【相关推荐:javascript视频教程,web前端】以上是JavaScript中switch的四个编写实例的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: