处理案件和案件的组合switch语句中的重复个案

时间:2014-09-24 21:03:39

标签: javascript optimization switch-statement case-statement

是否可以合并共享作业的cases,并为未共享的作业重复case,或者只是将每个作业分开?


用一个简单的例子说明.. case 0180都包含w = 330,因此它们已合并;分配给x的值对于每个值都是不同的,因此重复这些值以执行x分配。

switch(window.orientation) {
    case   0:
    case 180:
        w = 330;
        //break
    case   0:
        x = '-180px';
        //break
    case -90:
    case  90:
        w = 480;
        x = '0';
        break;
    case 180:
        x = '-80px';
        break;
}

4 个答案:

答案 0 :(得分:3)

当在switch语句中对每个元素执行多个操作时,最好不要重复相同的case两次。您可以通过总结同一case下的所有代码片段来轻松实现此目的。

例如,如果您要在A上执行操作case 0,在Bcase 0上执行操作case 1,那么您应该执行以下操作:

switch(variable) {
    case 0:
        // operation A;
    case 1:
        // operation B;
        break;
}

这将在A上执行Bcase 0操作,因为break上没有case 0

现在我们假设你写了这样的东西:

switch(variable) {
    case 1:
        x = 1;
        break;
    case 1:
        x = 2;
        break;
}

上述代码最终会将值1分配给变量x。第二个case 1,由于第一个x = 2中的break语句,因此永远无法达到case 1

因此,如果您必须在case 0case 1上执行不同的操作,但它们共享一些操作,那么最好将重复某些代码行而不是编写case 1的情况分开两次,因为这使您的代码更容易阅读并且速度更快。

因此,在您的代码中,实现您想要的最佳方法是:

switch(window.orientation) {
    case   0:
        x = '-180px';
        w = 330;
        break;
    case 180:
        x = '-80px';
        w = 330;
        break;
    case -90:
    case  90:
        w = 480;
        x = '0';
        break;
}

答案 1 :(得分:1)

我会说不要结合 - 错误的机会太高......就像你做的那样。永远不会达到第二个case 180,因为第一个break;之后会有{{1}}。

如果一切都一样,我认为可以合并(比如-90,90)。

答案 2 :(得分:0)

如果您运行Coverity之类的静态分析工具,则会报告轻微错误 如果您组合多个开关案例,如下所示。

   case -90:
   // Intentionally fall through
   case  90:
        w = 480;
        x = '0';
        break;

最好重复一些代码行而不是产生一些不希望的错误。

       case -90:
            w = 480;
            x = '0';
            break;
       case  90:
            w = 480;
            x = '0';
            break;

答案 3 :(得分:-1)

它无法正常工作。一旦执行了中断指令,就不会执行开关块中的剩余代码。 你可以像这样解决它:

switch(window.orientation) {
    case   0:
    case 180:
        w = 330;
    case   0:
        x = '-180px';
        break;
    case 180:
        x = '-80px';
        break;
    case -90:
    case  90:
        w = 480;
        x = '0';
        break;
    }