steven026 发表于 2023-10-27 15:51:04

警钟长鸣 switch...case一定要记得写break或return

本帖最后由 steven026 于 2023-10-27 16:40 编辑



***


> 记2023年10月27日,DreamNya(就是我),debug一个半小时把GPT4干限额都没查出原因,最后偶然发现原因是swtich...case没写break😖😖😖,警钟长鸣。



具体原理就不说了,反正记住case作用域一旦进入后,代码语句会忽略剩余的case条件一直运行直到break、return、throw语句出现或者swtich作用域结束为止,即使中间的case条件没有满足。

***

举个例子:
```js
switch(true){
    case true:{
      console.log(true)
    }
    case false:{
      console.log(false)
    }
    default:{
      console.log('警钟长鸣')
    }
}
// 运行结果:ture, false, '警钟长鸣'
```

上述代码进入switch作用域后首先遇到case true条件,因为true==true,所以会首先进入true作用域输出`true`,之后代码会忽略所有case条件包括default,并连续输出`false`、`警钟长鸣`。
上述代码可以视作:
```js
switch(true){
    case true:{
      console.log(true)
      console.log(false)
      console.log('警钟长鸣')
    }
}
```
要想让swtich...case正常工作,应该养成良好习惯,在每个case作用域末尾都加上break或return或throw语句,强制让代码退出。
正确代码如下
```js
switch (true) {
    case true: {
      console.log(true);
      break;
    }
    case false: {
      console.log(false);
      break;
    }
    default: {
      console.log('警钟长鸣');
    }
}
// 运行结果:true
```


***
痛,真的是太痛了😭

如果有条件的话建议使用ESLint
这个规则是ESLint内置推荐规则
https://eslint.nodejs.cn/docs/latest/rules/no-fallthrough

王一之 发表于 2023-10-27 16:03:26

哥哥来学go,go不用break/return

steven026 发表于 2023-10-27 16:04:10

王一之 发表于 2023-10-27 16:03
哥哥来学go,go不用break/return

学不动了 学不动了
![](https://bbs.tampermonkey.net.cn/data/attachment/forum/202309/25/161953bgj2vmm8g2umf102.jpg)

Yiero 发表于 2023-10-27 22:12:47

来投入 Webstorm 的怀抱吧, Webstorm 会对 fallthrough 的 switch 弹出警告 (笑
页: [1]
查看完整版本: 警钟长鸣 switch...case一定要记得写break或return