我认为switch 不是您用例的最佳选择。
另外,正如@NinaScholz 所指出的,myname != 'ROKA' && myname != 'TOKA' 将始终为真,否则您将落入第一个case。
让我们一步一步来看看重构代码的不同方法:
? 简化(非开关)代码
编写代码最简单、最直接的方法如下:
const myname = 'JOKA';
const dhaba = false;
if ('ROKA' === myname || 'MOKA' === myname || 'TOKA' === myname) {
alert('EEE');
} else if (myname === 'KOKA' && true && true) {
alert('FEEE');
} else {
alert(dhaba ? 'TEEEE' : 'CHEEE');
}
注意冗余检查是如何被删除的,最后一个 if - else 块已被替换为 ternary operator。
您的代码可能与您提供的示例不完全相同,或者随着时间的推移而发生变化。在这种情况下,您可以考虑上述简化代码以外的其他选项。
? 使用 Array.prototype.indexOf() 从单个变量中检查多个匹配项
但是,您可能需要在第一个 if 中签入更多元素。在这种情况下,您可以使用 Array 和 Array.prototype.indexOf() 检查其中是否有任何匹配项(如果没有匹配项,它将返回 -1):
const myname = 'JOKA';
const dhaba = false;
if (['ROKA', 'MOKA', 'TOKA'].indexOf(myname) !== -1) {
alert('EEE');
} else if (myname === 'KOKA' && true && true) {
alert('FEEE');
} else {
alert(dhaba ? 'TEEEE' : 'CHEEE');
}
? N 输入 - 输出(字符串)对 + 带开关的复杂默认值
您也可能有多个 myname 值映射到多个 alert() 参数,因此您可能会想写这样的东西:
const myname = 'JOKA';
const dhaba = false;
switch(myname) {
case 'XXX-1': alert('YYY-1'); break;
case 'XXX-2': alert('YYY-2'); break;
...
case 'XXX-N': alert('YYY-N'); break;
default:
if (myname === 'KOKA' && true && true) {
alert('FEEE');
} else {
alert(dhaba ? 'TEEEE' : 'CHEEE');
}
}
虽然这很好,但实际上,我认为它比检查 case 块内的附加条件更干净,更不容易出错,就像您在示例中所做的那样,并在此基础上做一些事情和 break或者让下一个块执行,我建议你考虑使用对象文字查找。
? N 输入 - 输出(字符串)对 + 带有对象文字查找的复杂默认值?
使用它们有多个优点:更好的可读性,更容易调试,可维护性,简洁(例如,无需添加break)...我认为对您来说最重要的一个,因为您添加了标签@ 987654340@ 在您的问题中,是不是性能更高。
这是因为虽然switch 必须评估每个case 条件直到找到break,所以它们的顺序很重要,对象查找只是哈希表查找,即O(1)。
考虑到这一点,我们可以像这样重构最后一个示例:
const myname = 'JOKA';
const dhaba = false;
const output = {
'XXX-1': 'YYY-1',
'XXX-2': 'YYY-2',
...
'XXX-N': 'YYY-N',
}[myname];
// Note output will be undefined if there isn't a match, so the first if
// will be evaluated to false in that scenario:
if (output) {
alert(output);
} else if (myname === 'KOKA' && true && true) {
alert('FEEE');
} else {
alert(dhaba ? 'TEEEE' : 'CHEEE');
}
? N 输入 - 输出(字符串)对 + 带有对象文字查找的单值默认值 ? 和 || (或)运营商
另外,请注意,如果您的 default 只是在 if 中使用另一个值,您可以使用简单的 || 运算符来做到这一点:
const myname = 'JOKA';
const output = {
'XXX-1': 'YYY-1',
'XXX-2': 'YYY-2',
...
'XXX-N': 'YYY-N',
}[myname] || 'DEFAULT OUTPUT';
alert(output);
? N 输入 - 输出(任意代码)对与对象文字查找?
请注意,您还可以使用 functions 或 arrow functions 为对象中的每个 case 执行任意代码:
const myname = 'JOKA';
const output = {
'XXX-1': () => { /* Do something... */ },
'XXX-2': () => { /* Do something... */ },
...
'XXX-N': () => { /* Do something... */ },
}[myname]();
...
请注意,您可以在对象声明上方声明这些 functions,并在应该具有相同行为的多个键之间共享它们:
const myname = 'JOKA';
const f1 = () => { /* Do something 1... */ };
const output = {
'XXX-1': f1,
'XXX-2': f1,
...
'XXX-N': () => { /* Do something... */ },
}[myname]();
...
有关用对象字面量查找替换 switchs 的更多信息,请查看此帖子:https://toddmotto.com/deprecating-the-switch-statement-for-object-literals