本帖最后由 steven026 于 2023-10-27 16:40 编辑
记2023年10月27日,DreamNya(就是我),debug一个半小时把GPT4干限额都没查出原因,最后偶然发现原因是swtich...case没写break😖😖😖,警钟长鸣。
具体原理就不说了,反正记住case作用域一旦进入后,代码语句会忽略剩余的case条件一直运行直到break、return、throw语句出现或者swtich作用域结束为止,即使中间的case条件没有满足。
举个例子:
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
、警钟长鸣
。
上述代码可以视作:
switch(true){
case true:{
console.log(true)
console.log(false)
console.log('警钟长鸣')
}
}
要想让swtich...case正常工作,应该养成良好习惯,在每个case作用域末尾都加上break或return或throw语句,强制让代码退出。
正确代码如下
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