switch-case语句中使用return和break的含义

29

出于好奇,我经常看到这样的情况:

switch(something) {
    case 'alice':
        return something;
    break;
}

如果似乎完全没有必要的地方出现了 break,那么它存在的原因是什么?


1
这很可能只是为了防止将来复制/粘贴和/或随意修改该代码导致的错误。对我来说,这看起来像是一个很好的安全网。 - jahroy
4
鉴于缩进,这可能只是一种风格上的选择——使用break作为建议块的结尾。但是,在一个return语句之后,break就成了无法到达的代码。所以它不会起作用,但也不会造成任何损害。 - Jonathan Lonowski
4个回答

32
return语句引入之前可能已经有break;语句了。因此,它已变得多余并且可以删除。
实际上,当您在jslint中运行该代码时,它将显示以下错误:

'return'之后的不可到达的'break'。

是否遵循这个建议取决于您;如果您试用了几种样式然后选择一种特定的样式,这可能在开发期间有所帮助。
这是一种替代的写作风格,有些人认为这是更好的做法:
var retval = null;
switch (something) {
    case 'alice':
        retval = something;
        break;
    // ...
}
return retval;

1
有些人(jslint)实际上认为符号表示一个“错误”,提示加1。 - RienNeVaPlu͢s
@RienNeVaPlus 好吧,这显然是Crockford的看法 :) - Ja͢ck

8
break 告诉 JavaScript 在 switch 块中停止评估 case。代码执行将继续通过关闭的 switch 括号。在示例代码中,return 语句确实会防止进一步执行任何内容,包括其他 case 语句和跟随 switch 块的任何内容。
我习惯在每个 case 中添加 break 语句。如果我编写了一个没有 break 的 case,那么将来我可能会复制和粘贴代码块,缺少 break 语句就会成为一个错误,例如:
function whereLivesA(species){
  switch(species){
    case 'worms': 
      // Relying on return to prevent further code execution within the switch
      // block works but is ~bad~ smelly (according to plato :D)
      var habitat = 'dirt'
      return (species + ' live in ' + habitat);
    case 'bees':
      var habitat = 'hive';
      break;
  }
  // Stuff to do after the switch statement (unless you returned already)
  var str = species+' live in '+habitat;
  return str;
}
console.log('whereLivesA');
console.log(whereLivesA("worms"));
console.log(whereLivesA("bees"));
  /* Output:
    whereLivesA
    worms live in dirt
    bees live in hive
  */


function whereLivesB(species){
  switch(species){
    case "worms": 
      // what if future code changes remove `return` and don't add `break`?
      // return (species + ' live in ' + habitat)
      var habitat = 'dirt';
      // break;
    case "bees":
      var habitat = 'hive'
      break;
  }
  // Stuff to do after the switch statement (unless you returned already)
  var str = species+' live in '+habitat;
  return str;
}
console.log('whereLivesB');
console.log(whereLivesB("bees"));
console.log(whereLivesB("worms"));
  /* Output:
    whereLivesB
    bees live in hive
    worms live in hive
  */


function whereLivesCorrect(species){
  switch(species){
    case "worms": 
      var habitat = 'dirt';
      break;
    case "bees":
      var habitat = 'hive'
      break;
  }
  // Stuff to do after the switch statement (unless you returned already)
  var str = species+' live in '+habitat;
  return str;
}

console.log('whereLivesCorrect');
console.log(whereLivesCorrect("bees"));
console.log(whereLivesCorrect("worms"));
  /* Output:
    whereLivesCorrect
    bees live in hive
    worms live in dirt
  */

JS初学者:如果您不想将其保存到文件并运行 node filename ,则可以按F12并将该脚本或其他自包含脚本粘贴到浏览器控制台中以运行它。

如果您使用node.js,则还可以在命令行中键入 node 来启动 node 控制台,然后将其粘贴到那里。


0

break关键字用于结束语句或退出循环,以便它不会继续运行。

例如:

html

what's your age?: <input type="text" id="ageOf"><br>
<input type="submit" onSubmit="postReply();">
<div id="reply"></div>

js

function postReply() {
  let ageOf = document.getElementById('ageOf');
  let response = document.getElementById('reply');

  switch(true) {

    case ageOf<18:
      response.innerHTML = "Keep practicing young padewan.";
      break;

    case ageOf>18 && ageOf<45: 
      response.innerHTML = "Much too learn, you have.";
      break;

    case ageOf >= 45:
      response.innerHTML = "You have sage wisdom.";
      break;

    default:
      response.innerHTML = "";
      break;
  }
}

因此,在提交时,表单应调用函数postReply(),检查用户答案,并根据值返回其中一个语句。


1
这些 case 标签后面的条件语句是有效的语法吗?ageOf < 18 看起来有点可疑。此外,OP 的问题实际上只涉及为什么有人会在 return 语句之后使用 break 语句。 - jahroy
A) 这些情况没有使用花括号包含。 B) 您必须将文字传递给 case。例如,不要使用 case 1: ageOf<18{},而是使用 var s = 'young'; if(age>18){s='medium'}; if(age>45){s=old'},然后 switch(s){ case 'young': ...; break; case 'medium'... } - Plato

-3

实际上情况非常必要

如果您有一个情况,则需要从该情况中退出,否则其他情况也会被选中。

在编程中使用情况经常被认为是不良实践,请尽量避免使用它们。

switch(casein){
case 1:{
break;
}
case 2:{
break
}
}

1
好的,一旦调用了“return”,函数就停止执行。 - Plato
你能解释一下为什么使用case语句通常被认为是不好的实践吗?还有,为什么在你的case语句中要加上{}? - RienNeVaPlu͢s
@user2701974 我认为你可能误解了问题。问题是关于在 return 后使用 break 的。switch..case 只是提供了背景。此外,switch 块并不被普遍认为是不好的实践;只是在可选方案中不太常用。 - Jonathan Lonowski
我认为,只要不能通过重构和/或应用面向对象编程(OOP)的概念来替换它们,case语句就是可以接受的。 - jahroy
1
不,我是在说它们被认为是一种糟糕的实践方法,因为人们倾向于使用它们而不是更复杂和更整洁的代码。总体而言,功能是相同的,但这更适用于顺序编程。我使用 {} 是因为我在澄清案例的开始和结束位置,它们并不是必需的。 - THE AMAZING

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接