【问题标题】:continue ALLWAYS Illegal in switch in JS but break works fine继续 ALLWAYS Illegal in switch in JS 但 break 工作正常
【发布时间】:2013-08-06 09:20:58
【问题描述】:
switch ("B")
{
case "A":
    break;
case "B":
    continue;
case "C":
    break;
default:
    break;
}

在 C++ 中简单正确的代码,但是当在稳定的 chrome 中用 javascript 编写时,它只会抛出一个错误“非法的 continue 语句”,看起来 continue 语句在 javascript 中的 switch 中是不允许的......听说过 return 但它只是返回和不继续...那么有没有办法继续在js中切换?

【问题讨论】:

  • 您需要说明您希望这段代码做什么,因为continue 没有为switch 定义(无论您多么希望它是),我们无法从您的要求中推断出您的要求不存在的语言功能示例。
  • 经过努力,我已经确定您希望跳转到列表中的下一个案例(您一直称其为“break”,但“break”的意思是完全离开开关)。正如我在回答中所讨论的那样,根本没有语法可以做到这一点。
  • 这很不幸,因为我遇到了一个可以从这种行为中受益的数据结构实例。 obj: { dims: [...], vars: [..., atts: [...], ...], atts: [...] } ,我使用路径来确定被引用的部分:dims.name、atts.name、vars.name.atts.attName,通常两个 atts 的处理方式相同,因为它们具有相同的内部属性。即switch (_path[0]) { case 'dims': break; case 'vars': ...if (_path[2] === 'atts') continue; /* on to 'atts'*/ break; case 'atts': break; } 唉,必须简单地求助于可信赖的 if/elses。

标签: javascript windows google-chrome loops switch-statement


【解决方案1】:

continueswitches 完全无关,在Javascript 中and not in C++ 无关:

int main()
{
    int x = 5, y = 0;
    switch (x) {
        case 1:
            continue;
        case 2:
            break;
        default:
            y = 4;
    }
}

错误:继续语句不在循环内

如果您想破案,请使用break;否则,让案件失败:

switch ("B")
{
    case "A":
        break;
    case "B":
    case "C":
        break;
    default:
        break;
}

如果您正在寻找 快捷方式跳转 到下一个案例,那么,不,您不能这样做。

switch ("B")
{
    case "A":
        break;
    case "B":
        if (something) {
           continue; // nope, sorry, can't do this; use an else
        }

        // lots of code
    case "C":
        break;
    default:
        break;
}

【讨论】:

  • LOL 我根本不懂 C++,所以我不得不接受 OP 的话... lmao
  • 需要注意的是,在switch 中使用continue 是可以的,只要你的switch 在一个循环中。在这种情况下,continue 实际上将是 break switch
  • @klerik:它会比breakswitch 做得更多;它会跳过当前循环迭代中的everything,并让你的程序员同事感到困惑。在那种情况下,你有一个循环中的continue,所以说它“在”一个switch 是误导性的。无论如何,我不会说它“OK”,因为它是意大利面条代码。
  • @LightningRacisinObrit 我无意冒犯你,我只是想改进你的答案。我试图找出是否可以在switch 中使用continue(用于我的循环)(因为'类似'break 将不起作用)。这里面没有意大利面,这只是另一个用例。我一生中从未使用过单一的“goTo”东西。
  • @klerik:没有冒犯!我只是不同意!
【解决方案2】:

我相信你可以通过使用标记的无限循环来模拟你想要的:

var a = "B";
loop: while( true ) {
    switch (a)
    {
    case "A":
        break loop;
    case "B":
        a = "C";
        continue loop;
    case "C":
        break loop;
    default:
        break loop;
    }
}

否则你应该考虑用其他方式表达你想要的。

即使你能做到这一点,这将是一个巨大的 WTF。只需使用 if else if。

【讨论】:

    【解决方案3】:

    我想你的意思是:

    switch ("B")
    {
        case "A":
            break;
        case "B":
        case "C":
            break;
        default:
            break;
    }
    

    不需要continue。当 B 来时,它会转到 C。

    【讨论】:

    • 是的,我是这个意思,我知道这一点,但我需要这种空虚作为 continue 语句,因为我需要休息;在“B”情况下的所有情况下,并且只有在一种情况下才能继续,继续为空将需要大量的垃圾代码在中断之前对其进行检查,并且不能保证不会出现无意继续而不是中断的情况跨度>
    • 那样的话,你为什么不把break;放在B中。
    • 因为我还需要继续在那里,有条件地,在我上面写的休息之前。
    • continue 旨在循环中以跳过列表中特定项目的执行。跟开关有什么关系
    • @Owyn:不,continue is not meant to be used in switches in C++。一点也不。
    【解决方案4】:

    没有break 语句的switch case 将“通过”(因为它被称为)到下一个。省略 break 将使代码的行为与您所说的一样,因为它是 switch 语句的默认/隐式行为。

    continue 语句的使用是为循环保留的,它的作用实际上与您想要的略有不同;它将中断循环的当前迭代并继续下一个迭代,重新评估循环条件。

    【讨论】:

    • 那么在switches中没有“落空”的捷径吗?
    • @Owyn:失败是默认行为——你通过不写break来做到这一点。不,您不能“跳转”到下一个案例。而且不要给我这种废话“我也需要break”,因为这完全是矛盾的
    【解决方案5】:

    其实你可以在 switch 内循环中使用它,在这种情况下 break/continue 是一个有用的组合

    看看这个例子

    var array = [1, 2, "I am a string", function(){}, {}, 1,2,3]
    for(let i in array){
        switch(typeof array[i]) {
        case "number":
            array[i] += " I was a number"
            break; // break from the switch but go on in the for-loop
                   // ie. go to *put esclamation mark*
        case "function":
            array[i] = "function"
            // fall through
        default:
            array[i] = `this is a ${JSON.stringify(array[i])} object`
            break; // also here goes to *put esclamation mark*
        case "string":
            continue; // continue with the next iteration of the loop
                      // ie. do not put exclamation mark in this case
        }
        array[i] += "!" // *put esclamation mark*
    }
    /*
    array will become
    [ "1 I was a number!", "2 I was a number!", "I am a string", "this is a \"function\" object!", "this is a {} object!", "1 I was a number!", "2 I was a number!", "3 I was a number!" ]
    */
    

    【讨论】:

      【解决方案6】:

      Continue 只能指循环。 它不能在 switch 语句中使用。 无论如何,你期望它有什么行为?

      【讨论】:

      • 我希望它可以继续检查下面的下一个案例陈述
      • 不放'break'关键字怎么样?
      • 那么它不会坏,我也需要它坏。
      • @Owyn:你到底在说什么?您要么希望它破裂,要么希望它进入下一个案例。你怎么可能两者都做
      • 两个不同条件下的情况下不是一次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多