你应该使用break in switch case loop吗?

时间:2016-07-06 02:34:05

标签: javascript loops switch-statement

以FizzBu​​zz为例,for循环中的这个switch case在每种情况下使用break。

we got the following error: ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.changetimestamp = now()" Position: 79 [ERROR:0, SQLSTATE:42601], while trying to run this SQL script:

在Mozilla的docs中,他们说......

  

与每个案例标签关联的可选break语句可确保   一旦匹配的语句,程序就会断开   执行并继续执行切换后的语句。如果   break被省略,程序在下一个继续执行   switch语句中的陈述

我假设他们的意思是当脚本检查num%15 == 0时,如果没有中断并且尽管它匹配为true,则它会转到num%3 == 0并且等等。那么我用100,000个数字进行了两次测试。一个有休息,一个没有休息。

我发现中断和不中断之间的差异大约为2秒,中断越来越快。但是经过多次迭代。

我的问题是,对于大多数构建小规模应用程序的开发人员来说,在循环中使用中断是否真的很重要?这是习惯和偏好的问题吗?想法?

4 个答案:

答案 0 :(得分:3)

当在switch语句中满足case条件时,它将执行该switch语句中的所有代码块,直到它达到退出命令(想想breakreturn)。所以break不仅改变了性能速度,而且还改变了功能。

考虑切换语句的简单方法是链接if - else语句的替代方法。

您的switch代码可以轻松编写

if (num % 15 == 0) {
   console.log("FizzBuzz");
} else if (num % 3 == 0) {
    console.log("Fizz");
} else if (num % 5 == 0) {
    console.log("Buzz");
} else {
    console.log(num);
}

如果删除break;语句,您将更改代码实际运行的方式。它会表现得更像

if (num % 15 == 0) {
   console.log("FizzBuzz");
}

if (num % 3 == 0 || num % 15 == 0) {
    console.log("Fizz");
}

if (num % 5 == 0 || num % 3 == 0 || num % 15 == 0) {
    console.log("Buzz");
} 

console.log(num);

主要区别在于缺少else条件。

答案 1 :(得分:2)

您可以使用<RestorePackages>true</RestorePackages> ... <Import Project="$(SolutionDir)\.nuget\nuget.targets" /> ... <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 获得不同的结果。如果没有break,它会在break上传递,例如它会打印出num = 15"FizzBuzz""Fizz""Buzz"。而"15"只会打印break。说过"FizzBuzz"案例之后你不需要休息,如果它在交换机的末尾。

答案 2 :(得分:0)

如果包含break声明,您无疑会介绍 错误( !) 进入你的程序!

原因如下:

如果包含break语句,逻辑将“简单地”落入代码中以获取其他条件。 。 。 不会(!) 评估这些条件!它会直接崩溃,就像众所周知的中国商店中众所周知的公牛一样。

换句话说,没有break语句, (num % 15 == 0)的情况会console.log() 四(!!)(不是“一个”)消息。同样,(num % 3 == 0)会记录 3,,依此类推。

“嘿...... 不要去那里。”

===== 编辑:考虑switch的原始(“C ...”)概念是“多方式{{ 1}}“发生在构造的 top ,它分支到体内的goto - 点之一。 case语句生成break,将您发送到goto的末尾。如果您包含它,那么“有用”的假设就是您打算做其他事情会发生的事情:一个switch只会“堕落”到下一个。 (缺少case,正是所做的那样。) “警告编码器!”

答案 3 :(得分:0)

详细说明Callum Morrisson的答案:

您可以 返回 一个案例中的值的情况下,可以优雅地移除break的情况。

例如,

switch(expression) {
    case x:
        return *something*
    case y:
        return *something different*
}

这不会由于return引起您的误解而导致失败。在此示例中,您可以将return视为break的两倍。

如果在一个案例中同时在returnbreak的switch语句上运行linter,则由于return破坏了您,您将收到无法到达的代码错误。 break之前有机会执行该语句。

// eslint
switch(expression) {
    case x:
        return *something*
        break; // error unreachable code
    case y:
        return *something different*
        break; // error unreachable code
}