返回介绍

第一部分 类型和语法

第二部分 异步和性能

5.7 switch

发布于 2023-05-24 16:38:21 字数 1878 浏览 0 评论 0 收藏 0

现在来简单介绍一下 switch ,可以把它看作 if..else if..else.. 的简化版本:

switch (a) {
    case 2:
        // 执行一些代码
        break;
    case 42:
        // 执行另外一些代码
        break;
    default:
        // 执行缺省代码
}

这里 a 与 case 表达式逐一进行比较。如果匹配就执行该 case 中的代码,直到 break 或者 switch 代码块结束。

这看似并无特别之处,但其中存在一些不太为人所知的陷阱。

首先,a 和 case 表达式的匹配算法与 === (参见第 4 章)相同。通常 case 语句中的 switch 都是简单值,所以这并没有问题。

然而,有时可能会需要通过强制类型转换来进行相等比较(即 == ,参见第 4 章),这时就需要做一些特殊处理:

var a = "42";

switch (true) {
    case a == 10:
        console.log( "10 or '10'" );
        break;
    case a == 42;
        console.log( "42 or '42'" );
        break;
    default:
        // 永远执行不到这里
}
// 42 or '42'

除简单值以外,case 中还可以出现各种表达式,它会将表达式的结果值和 true 进行比较。因为 a == 42 的结果为 true ,所以条件成立。

尽管可以使用 == ,但 switch 中 true 和 true 之间仍然是严格相等比较。即如果 case 表达式的结果为真值,但不是严格意义上的 true (参见第 4 章),则条件不成立。所以,在这里使用 || 和 && 等逻辑运算符就很容易掉进坑里:

var a = "hello world";
var b = 10;

switch (true) {
    case (a || b == 10):
        // 永远执行不到这里
        break;
    default:
        console.log( "Oops" );
}
// Oops

因为 (a || b == 10) 的结果是 "hello world" 而非 true ,所以严格相等比较不成立。此时可以通过强制表达式返回 true 或 false ,如 case !!(a || b == 10): (参见第 4 章)。

最后,default 是可选的,并非必不可少(虽然惯例如此)。break 相关规则对 default 仍然适用:

var a = 10;

switch (a) {
    case 1:
    case 2:
        // 永远执行不到这里
    default:
        console.log( "default" );
    case 3:
        console.log( "3" );
        break;
    case 4:
        console.log( "4" );
}
// default
// 3

正如之前介绍的,case 中的 break 也可以带标签。

上例中的代码是这样执行的,首先遍历并找到所有匹配的 case ,如果没有匹配则执行 default 中的代码。因为其中没有 break ,所以继续执行已经遍历过的 case 3 代码块,直到 break 为止。

理论上来说,这种情况在 JavaScript 中是可能出现的,但在实际情况中,开发人员一般不会这样来编码。如果确实需要这样做,就应该仔细斟酌并做好注释。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文