在执行多个相等的判断时, switch 语句可以达到与 if 一样的效果,代码还可以写得更优雅。

语法如下:

switch(x) {
    case value1:
        code
        [break]
    case value2:
        code
        [break]
    default:
        code
        [break]
}

x 会与每个 case 的值对比是否严格相等,如果相等则执行其中的代码块。否则会依次往下判断,如果都没有匹配则执行 default 中的代码块。

以下例子中就是将小于等于 3 的数字用中文数字的形式显示出来。

$$jsdemo$$
$$edit$$
let x = 2
switch (x) {
    case 0:
        alert("零")
        break
    case 1:
        alert("一")
        break
    case 2:
        alert("二")
        break
    case 3:
        alert("三")
        break
    default:
        alert("请输入零或小于等于三的正整数")
}

不可省略的 break

break 关键字会结束 switch 的执行,如果省略了 break 会导致匹配项和之后的所有代码块都被执行。

$$jsdemo$$
$$edit$$
let x = 2
switch (x) {
    case 0:
        alert("零")
    case 1:
        alert("一")
    case 2:
        alert("二") // 执行
    case 3:
        alert("三") // 执行
    default:
        alert("请输入零或小于等于三的正整数") // 执行
}

case 分组

可以让多个 case 分支共用一段代码块。

$$jsdemo$$
$$edit$$
let x = 3
switch (x) {
    case 0:
        alert("零")
        break
    case 1:
        alert("一")
        break
    case 2:
    case 3:
        alert("二或三")
        break
    default:
        alert("请输入零或小于等于三的正整数")
}

全等比较

switch 中的值与 case 中的值是采用的全等比较,包括类型上的判断,因此得额外注意两者的类型是否相等。

$$jsdemo$$
$$edit$$
let x = "2"
switch (x) {
    case 0:
        alert("零")
        break
    case 1:
        alert("一")
        break
    case 2:
        alert("二")
        break
    case 3:
        alert("三")
        break
    default:
        alert("请输入零或小于等于三的正整数")
}

总结

switch 能实现的使用 if ... else 都可以实现,部分情况下使用 switch 会使代码更整洁。也有部分语言直接舍弃了 switch 的语法,比如像 python 中就没有 switch


练习

  1. 将以下 if 语句改成 switch 语句。
$$edit$$
$$jsdemo$$
// 国家中英文名转换器
let input = prompt("输入中文国家名")
if (input === "中国") {
    alert("China")
} else if (input === "美国" || input === "美利坚") {
    alert("U.S.A")
} else if (input === "日本") {
    alert("Japan")
} else {
    alert("请输入我认识的国家")
}

$$answer

$$jsdemo$$
$$edit$$
// 国家中英文名转换器
let input = prompt("输入中文国家名")
switch (input) {
    case "中国":
        alert("China")
        break
    case "美国":
    case "美利坚":
        alert("U.S.A")
        break
    case "日本":
        alert("Japan")
        break
    default:
        alert("请输入我认识的国家")
        break
}
$$