js中的 switch 语句可以把它看作为 if else 的简化版本,用来选择多个需被执行的代码块之一。
1.语法
switch(表达式) {
case n:
代码块
break;
case n:
代码块
break;
default:
默认代码块
}
2.执行过程
- 计算一次 switch 表达式
- 把表达式的值与每个 case 的值进行对比
- 如果存在匹配,则执行关联代码
- 如果不存在匹配,则执行默认代码块
注意:
不要忘记写break语句,否则该case代码执行完不会结束会继续向下执行。
switch 表达式 和 case 表达式的匹配算法与 === 相同,所以在输入简单值的时候就没有问题,需要转换类型的时候就需要自己处理一下 。
3.break关键字
switch 语句是逐行执行的,当 switch 语句找到一个与之匹配的 case 子句时,不仅会执行该子句对应的代码,还会继续向后执行,直至 switch 语句结束。为了防止这种情况产生,需要在每个 case 子句的末尾使用 break 来跳出 switch 语句。
4.default语句
default 是 switch 子句,可以位于 switch 内任意位置,不会影响其它 case 子句的正常执行。如果 default 下面还有 case 子句,应该在 default 后面添加 break 语句,终止 switch 结构,防止程序突破 case 条件的限制继续执行下面 case 子句。
5.default 语句与 case 语句简单比较
- 语义不同:default 为默认项,case 为判例。
- 功能扩展:default 选项是唯一的,不可以扩展。而 case 选项是可扩展的,没有限制。
- 异常处理:default 与 case 扮演的角色不同,case 用于枚举,default 用于异常处理。
6.小练习: 输入年 月 日 ,计算当日在当年是第几天
<script>
const year = +prompt('请输入年份:')
const month = +prompt('请输入月份:')
const day = +prompt('请输入日期:')
let days = 0
let years
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) {
alert(`${year}年是闰年`)
years = 0
}
else {
alert(`${year}年是平年`)
years = 1
}
switch (years) {
case 0:
switch (month) {
case 1:
days = day
break
case 2:
if(day<=29){
days = 31 + day
}
break
case 3:
days = 31 + 29 + day
break
case 4:
days = 31 + 29 + 31 + day
break
case 5:
days = 31 + 29 + 31 + 30 + day
break
case 6:
days = 31 + 29 + 31 + 30 + 31 + day
break
case 7:
days = 31 + 29 + 31 + 30 + 31 + 30 + day
break
case 8:
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + day
break
case 9:
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + day
break
case 10:
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day
break
case 11:
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day
break
case 12:
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day
break
}
alert(`${year}年${month}月${day}日,是一年中的第${days}天`)
break
case 1:
switch (month) {
case 1:
days = day
break
case 2:
if(day<=28){
days = 31 + day
}else{
alert('输入错误')
}
break
case 3:
days = 31 + 28 + day
break
case 4:
days = 31 + 28 + 31 + day
break
case 5:
days = 31 + 28 + 31 + 30 + day
break
case 6:
days = 31 + 28 + 31 + 30 + 31 + day
break
case 7:
days = 31 + 28 + 31 + 30 + 31 + 30 + day
break
case 8:
days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day
break
case 9:
days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day
break
case 10:
days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day
break
case 11:
days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day
break
case 12:
days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day
break
}
alert(`${year}年${month}月${day}日,是一年中的第${days}天`)
break
}
</script>