写点东西《Javascript switch 语句的替代方法》
- 那么 switch 语句有什么问题?
- Object Literal 查找的替代方法
- 将我们学到的东西变成一个实用函数
- 您需要的一切都在一个地方# [](#javascript-version) Javascript 版本
- Tyepscript version
- ??更多精彩
本文扩展了 Todd Motto 关于用对象字面量替换 switch 语句的想法。这是过时、笨拙且冗长的
如果您对技术细节不感兴趣,只想了解实用程序函数,请向下滚动到最后一节(您需要的一切都在一个地方)。
那么 switch 语句有什么问题?
虽然 switch 语句在某些情况下很有用,但许多人认为它不是 Javscript 最适合其用途的设计。它不如其他结构灵活、可读和可维护。
例如,对
switch (fruit) { case 'apple': console.log('Apple selected'); // Missing break statement, falls through to the next case case 'orange': console.log('Orange selected'); break; case 'banana': console.log('Banana selected'); break; default: console.log('Unknown fruit'); }
在这个示例中,如果 fruit 为
Object Literal 查找的替代方法
与
以下是如何使用它们仅返回
const getDate (unit) { var date = { 'year': '2024', 'month': 'January', 'day': '21', 'default': 'Default value' }; return (date[unit] || date['default']); } var month = getDate('month'); console.log(month); // January
有时我们需要编写更复杂的代码,而仅返回
const getDate (unit) { var date = { 'year': () => { // do more complicated stuff here // just returning a string in this case return '2024'; }, 'month': () => { return 'January'; }, 'day': () => { return '21'; }, 'default': () => { return 'Default value' } }; // we return the Object literal's function invoked return (date[unit] || date['default'])(); } var month = getDate('month'); console.log(month); // January
但是如果我们想要一个贯穿行为呢?我们可以轻松地使用对象字面量来实现这一点,它更具可读性、声明性和更不易出错。它还不会涉及添加或删除
const getDayType (day) { const isWeekDay = () => { return 'Weekday'; } const isWeekEnd = () => { return 'Weekend'; } var days = { 'monday': isWeekDay, 'tuesday': isWeekDay, 'wednesday': isWeekDay, 'thursay': isWeekDay, 'friday': isWeekDay, 'saturday': isWeekEnd, 'sunday': isWeekEnd, 'default': () => { return 'Default value' } }; // we return the Object literal's function invoked return (days[day] || days['default'])(); } var dayType = getDayType('sunday'); console.log(dayType); // WeekEnd
将我们学到的东西变成一个实用函数
既然我们已经学会了如何使用 Object Literal 而不是
我们称我们的函数为
const switchCase = ({cases, defaultCase}) { }
const switchCase = ({cases, defaultCase}) { return (expression) => { } }
现在,回调函数需要做的就是返回调用的对象字面量函数。
const switchCase = ({cases, defaultCase}) { return (expression) => { return (cases[expression] || defaultCase)(); } }
就是这样!现在让我们看一个如何使用它的示例。
let date = new Date() const today = switchCase({ cases: { year: () => date.getFullYear(), month: () => date.getMonth() + 1, day: () => date.getDate() }, defaultCase: () => date }) today('year') // current year today('month') // current month today('day') // current day today('century') // default case - returns the current date Object
对于 typescript 用户,我们可以利用泛型来允许以后要调用该函数的用户指定他们希望对象字面量函数返回的类型。
type SwitchCase<T> = { cases: {[key: string]: () => T}, defaultCase: () => T } const switchCase = <T,>({cases, defaultCase}: SwitchCase<T>) => { return (expression: string) => { return (cases[expression] || defaultCase)() } }
这就是我们如何使用它的方式。请注意,我们不必总是指定类型,因为 Typescript 会自动推断它,除非它是多个类型的联合,如下所示。
let date = new Date() const today = switchCase<number | Date>({ cases: { year: () => date.getFullYear(), month: () => date.getMonth() + 1, day: () => date.getDate() }, defaultCase: () => date }) today('year') // current year today('month') // current month today('day') // current day today('century') // default case - returns the current date Object
您需要的一切都在一个地方# Javascript 版本
实用程序函数:
const switchCase = ({cases, defaultCase}) => (expression) => (cases[expression] || defaultCase)()
用法: Tyepscript 版本
let date = new Date() const today = switchCase({ cases: { year: () => date.getFullYear(), month: () => date.getMonth() + 1, day: () => date.getDate() }, defaultCase: () => date }) today('year') // current year today('month') // current month today('day') // current day today('century') // default case - returns the current date Object
Tyepscript version
实用功能:
const switchCase = <T,>({cases, defaultCase}: {cases: {[key: string]: () => T}, defaultCase: () => T}) => (expression: string) => (cases[expression] || defaultCase)()
用法:
let date = new Date() const today = switchCase<number | Date>({ cases: { year: () => date.getFullYear(), month: () => date.getMonth() + 1, day: () => date.getDate() }, defaultCase: () => date }) today('year') // current year today('month') // current month today('day') // current day today('century') // default case - returns the current date Object
??更多精彩
点击??这里~~