优化JavaScript中的switch语句
switch 语句 对于某些编程任务是必不可少的。 在本文中,您将学习如何使用 switch
并希望获得直觉,知道何时应该使用它。
使用 switch
的一个标志是当您有很多连续的 if/else
语句时。 让我们看一个使用 if/else
的示例,然后我们将查看 switch
等价物进行比较:
let dayIndex = new Date().getDay(); let day; if (dayIndex === 0) { day = 'Sunday'; } else if (dayIndex === 1) { day = 'Monday'; } else if (dayIndex === 2) { day = 'Tuesday'; } else if (dayIndex === 3) { day = 'Wednesday'; } else if (dayIndex === 4) { day = 'Thursday'; } else if (dayIndex === 5) { day = 'Friday'; } else if (dayIndex === 6) { day = 'Saturday'; }; console.log(day); // "Friday"
你知道吗? JavaScript 没有获取星期几的本地方法!
使用 if/else
真的很冗长,并且包含许多 switch
可以轻松处理的不必要的样板:
let dayIndex = new Date().getDay(); let day; switch (dayIndex) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday"; break; }; console.log(day); // "Friday"
几乎没有任何代码,而且令人耳目一新。 这是因为 switch
将 重点放在可能的值 上,而不是值 的 条件上。
使用中断
由于 JavaScript 将多次浏览整个 case
分支,因此建议使用 break
来防止意外的 case
匹配或使引擎不必解析额外的代码。
switch (dayIndex) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday"; break; }
在此示例中,break
实际上并没有提供任何额外的安全性,因为 case 2
永远不可能是 case 5
(例如),因此 break
有点无关紧要。 这种对 break
的严格使用似乎是开发人员喜欢使用分号 (;) 的优先事项。 采用显式编程方法的开发人员将对每个 case
使用 break
,而一些开发人员仅在 switch
中策略性地使用 break
。 然而,全面使用它会带来轻微的性能提升,因为即使没有机会让另一种情况为真,至少您甚至不会让引擎运行其余的 switch 语句。
“break”的策略性使用
有时您实际上会希望您的案件“失败”。 对这些实例使用 break
更多的是一种策略,而不是一种安全措施。
let seasonIndex = new Date().getMonth(); let season; switch (seasonIndex) { case 0: case 1: case 2: season = 'Winter'; // January, February, March break; case 3: case 4: case 5: season = 'Spring'; // April, May, June break; case 6: case 7: case 8: season = 'Summer'; // July, August, September break; case 9: case 10: case 11: season = 'Autumn'; // October, November, December break; }
在此示例中,案例“失败”,break
用于提前明确退出 switch
。 这允许您将多个案例与单个值合并在一起。
if/else
版本需要使用大量 ||
逻辑运算符,这些运算符看起来并不透明:
if (seasonIndex === 0 || seasonIndex === 1 || seasonIndex === 2) { season = 'Winter'; } else if (seasonIndex === 3 || seasonIndex === 4 || seasonIndex === 5) { season = 'Spring'; } else if (seasonIndex === 6 || seasonIndex === 7 || seasonIndex === 8) { season = 'Summer'; } else if (seasonIndex === 9 || seasonIndex === 10 || seasonIndex === 11) { season = 'Fall'; }
处理违约案件
switch
的另一个特性是能够处理意外或一般情况。 回到我们的第一个例子,我们可以使用 default
来实现错误处理:
let dayIndex = new Date().getDay(); let day; switch (dayIndex) { default: day = new Error('Invalid argument: "dayIndex" must be an integer from 0 –> 6'); case 0: day = 'Sunday'; break; case 1: day = 'Monday'; break; case 2: day = 'Tuesday'; break; case 3: day = 'Wednesday'; break; case 4: day = 'Thursday'; break; case 5: day = 'Friday'; break; case 6: day = 'Saturday'; break; }
您可能已经注意到 default
外壳放置在顶部。 不用担心! 它将按预期工作,因为 JavaScript 会在确定 default
之前遍历所有 case
分支。
您还可以将 default
用于您的通用案例:
let beverage = 'Mr. Pibb'; let cost; switch (beverage) { default: cost = 0.05; case 'Pepsi': cost = 1.00; break; case 'Coca-Cola': cost = 1.00; break; case 'Dr. Pepper': cost = 2.00; break; case 'Moutain Dew': cost = 5.00; break; } console.log(cost); // 0.05
这可以确保您从 switch
中获得一些排序值,即使它与您定义的任何 cases
都不匹配。
结论
当您发现自己要编写大量连续的 if/else
语句时,switch 语句是一个不错的选择。 即使您可能不像 for-loop
那样频繁地使用 switch
,但在您需要时也没有替代品。 Lodash 和 Redux 等现代库今天仍在使用 switch
,这使其成为 JavaScript 的那些老派主力功能之一,您将始终需要掌握腰带。
要了解有关 switch
的更多信息,请访问 Mozilla Developer 网站。