JavaScript Switch Statement

Switch Statement Basics

The switch statement is a control structure that allows multi-way branching based on the value of an expression. It provides a cleaner alternative to long chains of if-else statements when comparing the same value against multiple possible matches.

javascript
1// Basic switch statement structure
2let day = "Monday";
3
4switch (day) {
5    case "Monday":
6        console.log("Start of week");
7        break;
8    case "Friday":
9        console.log("Weekend is near");
10        break;
11    default:
12        console.log("It's a regular day");
13}
14
15// Execution flow explanation:
16// 1. Evaluate the expression (day = "Monday")
17// 2. Compare with case "Monday" → match found
18// 3. Execute console.log("Start of week")
19// 4. break statement exits the switch block
20// 5. default case is skipped
21
22console.log("Program continues..."); // This always executes

Switch Statement Core Components

  • Expression Evaluation - Switch evaluates an expression once at the beginning
  • Case Comparison - Each case compares against the expression using strict equality (===)
  • Break Statement - Prevents fall-through to next cases
  • Default Case - Executes when no cases match (optional)

Switch Statement Syntax and Structure

Understanding the complete syntax of switch statements is crucial for writing effective multi-way conditional logic. The structure includes the switch expression, multiple case clauses, and optional default case.

javascript
1// Complete switch syntax breakdown
2
3// 1. Basic switch with multiple cases
4let fruit = "apple";
5
6switch (fruit) {
7    case "apple":
8        console.log("Red fruit");
9        break;
10    case "banana":
11        console.log("Yellow fruit");
12        break;
13    case "orange":
14        console.log("Orange fruit");
15        break;
16    default:
17        console.log("Unknown fruit");
18}
19
20// 2. Switch with number expressions
21let month = 3;
22
23switch (month) {
24    case 1:
25        console.log("January");
26        break;
27    case 2:
28        console.log("February");
29        break;
30    case 3:
31        console.log("March"); // This executes
32        break;
33    case 4:
34        console.log("April");
35        break;
36    default:
37        console.log("Other month");
38}
39
40// 3. Switch with grouped cases (fall-through)
41let grade = "B";
42
43switch (grade) {
44    case "A":
45    case "B":
46    case "C":
47        console.log("You passed!"); // Executes for A, B, or C
48        break;
49    case "D":
50    case "F":
51        console.log("You failed");
52        break;
53    default:
54        console.log("Invalid grade");
55}
56
57// 4. Switch with return values in functions
58function getDayType(day) {
59    switch (day) {
60        case "Saturday":
61        case "Sunday":
62            return "Weekend";
63        case "Monday":
64        case "Tuesday":
65        case "Wednesday":
66        case "Thursday":
67        case "Friday":
68            return "Weekday";
69        default:
70            return "Invalid day";
71    }
72}
73
74console.log(getDayType("Sunday")); // Output: "Weekend"
75
76// 5. Switch with complex expressions
77let score = 85;
78
79switch (true) {
80    case score >= 90:
81        console.log("Grade: A");
82        break;
83    case score >= 80:
84        console.log("Grade: B"); // This executes
85        break;
86    case score >= 70:
87        console.log("Grade: C");
88        break;
89    default:
90        console.log("Grade: F");
91}
92
93// Syntax rules:
94// - Expression in parentheses after switch
95// - case values followed by colon
96// - break statements prevent fall-through
97// - default case is optional but recommended

Switch Syntax Components

  • switch (expression) - Evaluates expression once, compares with cases
  • case value: - Compares using ===, executes code if match
  • break; - Exits switch block, prevents fall-through
  • default: - Executes when no cases match (optional)

Break Statements and Fall-Through Behavior

The break statement is crucial in switch statements to prevent 'fall-through' behavior. Understanding when to use break and when to intentionally allow fall-through is key to mastering switch statements.

javascript
1// Understanding break and fall-through
2
3// Example 1: With break statements (normal behavior)
4let color = "red";
5
6switch (color) {
7    case "red":
8        console.log("Color is red");
9        break; // Exits switch block
10    case "blue":
11        console.log("Color is blue");
12        break;
13    case "green":
14        console.log("Color is green");
15        break;
16    default:
17        console.log("Unknown color");
18}
19// Only "Color is red" is printed
20
21// Example 2: Intentional fall-through (no break)
22let day = "Monday";
23
24switch (day) {
25    case "Monday":
26        console.log("Start of work week");
27        // No break - fall through!
28    case "Tuesday":
29    case "Wednesday":
30    case "Thursday":
31        console.log("It's a workday"); // Executes for Monday-Thursday
32        break;
33    case "Friday":
34        console.log("Almost weekend!");
35        break;
36    case "Saturday":
37    case "Sunday":
38        console.log("Weekend!");
39        break;
40}
41// For Monday: Both messages print due to fall-through
42
43// Example 3: Dangerous accidental fall-through
44let number = 1;
45
46switch (number) {
47    case 1:
48        console.log("Number is 1");
49        // Oops! Forgot break
50    case 2:
51        console.log("Number is 2"); // This also executes!
52        break;
53    case 3:
54        console.log("Number is 3");
55        break;
56}
57// Both "Number is 1" and "Number is 2" print!
58
59// Example 4: Using return instead of break in functions
60function getSeason(month) {
61    switch (month) {
62        case 12:
63        case 1:
64        case 2:
65            return "Winter"; // return exits function, no break needed
66        case 3:
67        case 4:
68        case 5:
69            return "Spring";
70        case 6:
71        case 7:
72        case 8:
73            return "Summer";
74        case 9:
75        case 10:
76        case 11:
77            return "Fall";
78        default:
79            return "Invalid month";
80    }
81}
82
83console.log(getSeason(1)); // Output: "Winter"
84
85// Example 5: Multiple operations in a case
86let operation = "increment";
87let count = 5;
88
89switch (operation) {
90    case "increment":
91        count++;
92        console.log("Count incremented");
93        break;
94    case "decrement":
95        count--;
96        console.log("Count decremented");
97        break;
98    case "reset":
99        count = 0;
100        console.log("Count reset");
101        break;
102    default:
103        console.log("Unknown operation");
104}
105
106console.log("Count is:", count); // Output: Count is: 6
107
108// Example 6: Commenting intentional fall-through
109let userRole = "moderator";
110
111switch (userRole) {
112    case "admin":
113        console.log("Full access granted");
114        // fall through - admins also have moderator privileges
115    case "moderator":
116        console.log("Content moderation access");
117        // fall through - moderators also have user privileges
118    case "user":
119        console.log("Basic user access");
120        break;
121    default:
122        console.log("No access");
123}
124// For moderator: All three messages print due to intentional fall-through

Switch vs If-Else: When to Use Each

Understanding when to use switch statements versus if-else chains helps you write cleaner, more maintainable code. Each has its strengths and appropriate use cases.

javascript
1// Scenario 1: Multiple discrete values - SWITCH is better
2let direction = "north";
3
4// Switch version (cleaner)
5switch (direction) {
6    case "north":
7        console.log("Moving up");
8        break;
9    case "south":
10        console.log("Moving down");
11        break;
12    case "east":
13        console.log("Moving right");
14        break;
15    case "west":
16        console.log("Moving left");
17        break;
18    default:
19        console.log("Invalid direction");
20}
21
22// If-else version (more verbose)
23if (direction === "north") {
24    console.log("Moving up");
25} else if (direction === "south") {
26    console.log("Moving down");
27} else if (direction === "east") {
28    console.log("Moving right");
29} else if (direction === "west") {
30    console.log("Moving left");
31} else {
32    console.log("Invalid direction");
33}
34
35// Scenario 2: Range checking - IF-ELSE is better
36let temperature = 25;
37
38// If-else version (better for ranges)
39if (temperature > 30) {
40    console.log("Hot");
41} else if (temperature > 20) {
42    console.log("Warm");
43} else if (temperature > 10) {
44    console.log("Cool");
45} else {
46    console.log("Cold");
47}
48
49// Switch version (awkward for ranges)
50switch (true) {
51    case temperature > 30:
52        console.log("Hot");
53        break;
54    case temperature > 20:
55        console.log("Warm");
56        break;
57    case temperature > 10:
58        console.log("Cool");
59        break;
60    default:
61        console.log("Cold");
62}
63
64// Scenario 3: Multiple conditions per case - SWITCH with fall-through
65let day = "Monday";
66
67// Switch with fall-through (elegant)
68switch (day) {
69    case "Monday":
70    case "Tuesday":
71    case "Wednesday":
72    case "Thursday":
73    case "Friday":
74        console.log("Weekday");
75        break;
76    case "Saturday":
77    case "Sunday":
78        console.log("Weekend");
79        break;
80}
81
82// If-else version (repetitive)
83if (day === "Monday" || day === "Tuesday" || day === "Wednesday" || 
84    day === "Thursday" || day === "Friday") {
85    console.log("Weekday");
86} else if (day === "Saturday" || day === "Sunday") {
87    console.log("Weekend");
88}
89
90// Scenario 4: Complex boolean logic - IF-ELSE is better
91let age = 25;
92let hasLicense = true;
93let hasInsurance = true;
94
95// If-else handles complex logic better
96if (age >= 18 && hasLicense && hasInsurance) {
97    console.log("Can drive legally");
98} else if (age >= 16 && hasLicense) {
99    console.log("Can drive with restrictions");
100} else {
101    console.log("Cannot drive");
102}
103
104// Switch would be very awkward for this scenario
105
106// Scenario 5: Enum-like values - SWITCH is perfect
107const STATUS = {
108    PENDING: "pending",
109    APPROVED: "approved", 
110    REJECTED: "rejected"
111};
112
113let status = STATUS.PENDING;
114
115switch (status) {
116    case STATUS.PENDING:
117        console.log("Processing...");
118        break;
119    case STATUS.APPROVED:
120        console.log("Approved!");
121        break;
122    case STATUS.REJECTED:
123        console.log("Rejected");
124        break;
125}
126
127// Guidelines:
128// - Use SWITCH for: discrete values, enum-like patterns, multiple same-value checks
129// - Use IF-ELSE for: ranges, complex boolean logic, few conditions

Advanced Switch Patterns and Techniques

Beyond basic usage, switch statements support advanced patterns that make them more powerful and flexible in real-world applications.

javascript
1// Pattern 1: Switch with expressions in cases
2let score = 85;
3
4switch (true) {
5    case score >= 90 && score <= 100:
6        console.log("Grade: A");
7        break;
8    case score >= 80 && score < 90:
9        console.log("Grade: B"); // This executes
10        break;
11    case score >= 70 && score < 80:
12        console.log("Grade: C");
13        break;
14    default:
15        console.log("Grade: F");
16}
17
18// Pattern 2: Switch in arrow functions
19const getPaymentMethod = (method) => {
20    switch (method) {
21        case "credit":
22            return "Credit Card";
23        case "debit":
24            return "Debit Card";
25        case "paypal":
26            return "PayPal";
27        default:
28            return "Unknown method";
29    }
30};
31
32console.log(getPaymentMethod("credit")); // Output: "Credit Card"
33
34// Pattern 3: Switch with object destructuring
35const user = { role: "admin", status: "active" };
36
37switch (user.role) {
38    case "admin":
39        console.log("Admin dashboard");
40        if (user.status === "active") {
41            console.log("Active admin");
42        }
43        break;
44    case "user":
45        console.log("User dashboard");
46        break;
47}
48
49// Pattern 4: Switch with function calls in cases
50function isWeekend(day) {
51    return day === "Saturday" || day === "Sunday";
52}
53
54function isWeekday(day) {
55    return !isWeekend(day);
56}
57
58let today = "Monday";
59
60switch (true) {
61    case isWeekend(today):
62        console.log("Relax time!");
63        break;
64    case isWeekday(today):
65        console.log("Work time!"); // This executes
66        break;
67}
68
69// Pattern 5: Switch with early returns in functions
70function calculateShipping(country, weight) {
71    switch (country) {
72        case "US":
73            if (weight > 10) return 20;
74            return 10;
75        case "UK":
76            if (weight > 5) return 15;
77            return 8;
78        case "CA":
79            return 12; // Flat rate
80        default:
81            return 25; // International default
82    }
83}
84
85console.log(calculateShipping("US", 8)); // Output: 10
86
87// Pattern 6: Switch with computed case values
88const ACTIONS = {
89    ADD: "ADD",
90    DELETE: "DELETE", 
91    UPDATE: "UPDATE"
92};
93
94let action = "ADD";
95let dynamicCase = "ADD";
96
97switch (action) {
98    case dynamicCase:
99        console.log("Dynamic case matched!"); // This executes
100        break;
101    case ACTIONS.DELETE:
102        console.log("Delete action");
103        break;
104}
105
106// Pattern 7: Nested switch statements
107let category = "electronics";
108let subcategory = "phone";
109
110switch (category) {
111    case "electronics":
112        switch (subcategory) {
113            case "phone":
114                console.log("Smartphones and accessories");
115                break;
116            case "laptop":
117                console.log("Laptops and computers");
118                break;
119        }
120        break;
121    case "clothing":
122        console.log("Fashion items");
123        break;
124}
125
126// Pattern 8: Switch with error handling
127function processCommand(command) {
128    try {
129        switch (command.type) {
130            case "create":
131                // Create logic
132                return "Created successfully";
133            case "update":
134                // Update logic
135                return "Updated successfully";
136            case "delete":
137                // Delete logic
138                return "Deleted successfully";
139            default:
140                throw new Error(`Unknown command: ${command.type}`);
141        }
142    } catch (error) {
143        console.error("Command failed:", error.message);
144        return "Command failed";
145    }
146}
147
148// Pattern 9: Switch with async operations
149async function handleApiResponse(statusCode) {
150    switch (statusCode) {
151        case 200:
152        case 201:
153            return "Success";
154        case 400:
155            return "Bad Request";
156        case 401:
157            return "Unauthorized";
158        case 404:
159            return "Not Found";
160        case 500:
161            return "Server Error";
162        default:
163            return "Unknown status";
164    }
165}
166
167// Usage
168handleApiResponse(200).then(console.log); // Output: "Success"

Common Switch Statement Mistakes

Understanding common mistakes in switch statements helps you write more robust and bug-free code. These pitfalls often lead to unexpected behavior and hard-to-find bugs.

javascript
1// Mistake 1: Forgetting break statements (accidental fall-through)
2let number = 1;
3
4// WRONG - accidental fall-through
5switch (number) {
6    case 1:
7        console.log("Number is 1");
8        // Oops! Forgot break
9    case 2:
10        console.log("Number is 2"); // This also executes!
11        break;
12    case 3:
13        console.log("Number is 3");
14        break;
15}
16// Both messages print!
17
18// CORRECT - always use break unless intentional fall-through
19switch (number) {
20    case 1:
21        console.log("Number is 1");
22        break; // Important!
23    case 2:
24        console.log("Number is 2");
25        break;
26    case 3:
27        console.log("Number is 3");
28        break;
29}
30
31// Mistake 2: Using wrong comparison operator (switch uses ===)
32let value = "5";
33
34// WRONG - expecting type coercion like ==
35switch (value) {
36    case 5: // This won't match! "5" !== 5
37        console.log("Value is 5");
38        break;
39    default:
40        console.log("No match"); // This executes
41}
42
43// CORRECT - ensure types match or convert first
44switch (Number(value)) { // Convert to number
45    case 5:
46        console.log("Value is 5"); // This executes
47        break;
48    default:
49        console.log("No match");
50}
51
52// Mistake 3: Duplicate case values
53let fruit = "apple";
54
55// WRONG - duplicate cases
56switch (fruit) {
57    case "apple":
58        console.log("Red apple");
59        break;
60    case "apple": // Duplicate! Syntax error
61        console.log("Green apple");
62        break;
63}
64
65// CORRECT - use different values or if-else for conditions
66switch (fruit) {
67    case "red apple":
68        console.log("Red apple");
69        break;
70    case "green apple":
71        console.log("Green apple");
72        break;
73}
74
75// Mistake 4: Not using default case
76let status = "unknown";
77
78// WRONG - no handling for unexpected values
79switch (status) {
80    case "active":
81        console.log("Active");
82        break;
83    case "inactive":
84        console.log("Inactive");
85        break;
86    // No default - silent failure for "unknown"
87}
88
89// CORRECT - always include default case
90switch (status) {
91    case "active":
92        console.log("Active");
93        break;
94    case "inactive":
95        console.log("Inactive");
96        break;
97    default:
98        console.log("Unknown status"); // Handles unexpected values
99        break;
100}
101
102// Mistake 5: Complex logic that should be if-else
103let age = 25;
104let hasLicense = true;
105
106// WRONG - switch is awkward for complex conditions
107switch (true) {
108    case age >= 18 && hasLicense:
109        console.log("Can drive");
110        break;
111    case age >= 16 && hasLicense:
112        console.log("Can drive with restrictions");
113        break;
114    default:
115        console.log("Cannot drive");
116}
117
118// CORRECT - use if-else for complex boolean logic
119if (age >= 18 && hasLicense) {
120    console.log("Can drive");
121} else if (age >= 16 && hasLicense) {
122    console.log("Can drive with restrictions");
123} else {
124    console.log("Cannot drive");
125}
126
127// Mistake 6: Not grouping related cases
128let day = "Monday";
129
130// WRONG - repetitive code
131switch (day) {
132    case "Monday":
133        console.log("Weekday");
134        break;
135    case "Tuesday":
136        console.log("Weekday");
137        break;
138    case "Wednesday":
139        console.log("Weekday");
140        break;
141    // ... repeated for all weekdays
142}
143
144// CORRECT - group related cases
145switch (day) {
146    case "Monday":
147    case "Tuesday":
148    case "Wednesday":
149    case "Thursday":
150    case "Friday":
151        console.log("Weekday");
152        break;
153    case "Saturday":
154    case "Sunday":
155        console.log("Weekend");
156        break;
157}
158
159// Mistake 7: Using switch for very few cases
160let color = "red";
161
162// WRONG - switch overkill for 2-3 cases
163switch (color) {
164    case "red":
165        console.log("Red");
166        break;
167    case "blue":
168        console.log("Blue");
169        break;
170    default:
171        console.log("Other");
172}
173
174// CORRECT - simple if-else is cleaner
175if (color === "red") {
176    console.log("Red");
177} else if (color === "blue") {
178    console.log("Blue");
179} else {
180    console.log("Other");
181}

Switch Statement Best Practices

Following established best practices for switch statements leads to more readable, maintainable, and bug-free code. These guidelines help you write clean and effective conditional logic.

javascript
1// Best Practice 1: Always include a default case
2let status = "pending";
3
4// GOOD - handles unexpected values
5switch (status) {
6    case "pending":
7        console.log("Processing...");
8        break;
9    case "completed":
10        console.log("Done!");
11        break;
12    default:
13        console.log("Unknown status");
14        break;
15}
16
17// Best Practice 2: Use consistent break statements
18let operation = "add";
19
20// GOOD - consistent break usage
21switch (operation) {
22    case "add":
23        console.log("Adding...");
24        break;
25    case "subtract":
26        console.log("Subtracting...");
27        break;
28    case "multiply":
29        console.log("Multiplying...");
30        break;
31    default:
32        console.log("Unknown operation");
33        break; // Break in default too!
34}
35
36// Best Practice 3: Comment intentional fall-through
37let userLevel = "premium";
38
39// GOOD - clearly marked fall-through
40switch (userLevel) {
41    case "admin":
42        console.log("Admin privileges");
43        // fall through - admins get all premium features
44    case "premium":
45        console.log("Premium features");
46        // fall through - premium users get enhanced features
47    case "enhanced":
48        console.log("Enhanced features");
49        // fall through - all users get basic features
50    case "basic":
51        console.log("Basic features");
52        break;
53    default:
54        console.log("No access");
55        break;
56}
57
58// Best Practice 4: Group related cases logically
59const DAYS = {
60    WEEKDAY: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
61    WEEKEND: ["Saturday", "Sunday"]
62};
63
64let day = "Monday";
65
66// GOOD - logical grouping
67switch (day) {
68    case "Monday":
69    case "Tuesday":
70    case "Wednesday":
71    case "Thursday":
72    case "Friday":
73        console.log("Work day");
74        break;
75    case "Saturday":
76    case "Sunday":
77        console.log("Weekend");
78        break;
79    default:
80        console.log("Invalid day");
81        break;
82}
83
84// Best Practice 5: Use constants for case values
85const ACTIONS = {
86    CREATE: "CREATE",
87    READ: "READ",
88    UPDATE: "UPDATE",
89    DELETE: "DELETE"
90};
91
92let action = ACTIONS.CREATE;
93
94// GOOD - using constants prevents typos
95switch (action) {
96    case ACTIONS.CREATE:
97        console.log("Creating record");
98        break;
99    case ACTIONS.READ:
100        console.log("Reading record");
101        break;
102    case ACTIONS.UPDATE:
103        console.log("Updating record");
104        break;
105    case ACTIONS.DELETE:
106        console.log("Deleting record");
107        break;
108    default:
109        console.log("Unknown action");
110        break;
111}
112
113// Best Practice 6: Keep cases simple; extract complex logic
114function handleUserAction(action, user) {
115    switch (action) {
116        case "login":
117            return performLogin(user); // Extract complex logic
118        case "logout":
119            return performLogout(user);
120        case "update":
121            return updateUserProfile(user);
122        default:
123            throw new Error(`Unknown action: ${action}`);
124    }
125}
126
127function performLogin(user) {
128    // Complex login logic here
129    return `User ${user.name} logged in`;
130}
131
132// Best Practice 7: Consider alternatives for long switch statements
133const statusHandlers = {
134    pending: () => console.log("Processing..."),
135    completed: () => console.log("Done!"),
136    failed: () => console.log("Failed"),
137    // Add more handlers as needed
138};
139
140let currentStatus = "pending";
141
142// For very long switches, object lookup can be cleaner
143if (statusHandlers[currentStatus]) {
144    statusHandlers[currentStatus]();
145} else {
146    console.log("Unknown status");
147}
148
149// Best Practice 8: Use descriptive variable names
150const ORDER_STATUS = {
151    PENDING: "PENDING",
152    SHIPPED: "SHIPPED",
153    DELIVERED: "DELIVERED",
154    CANCELLED: "CANCELLED"
155};
156
157let orderStatus = ORDER_STATUS.PENDING;
158
159// GOOD - descriptive names make code self-documenting
160switch (orderStatus) {
161    case ORDER_STATUS.PENDING:
162        console.log("Order is being processed");
163        break;
164    case ORDER_STATUS.SHIPPED:
165        console.log("Order is on the way");
166        break;
167    case ORDER_STATUS.DELIVERED:
168        console.log("Order delivered successfully");
169        break;
170    case ORDER_STATUS.CANCELLED:
171        console.log("Order was cancelled");
172        break;
173    default:
174        console.log("Unknown order status");
175        break;
176}
177
178// Best Practice 9: Align cases properly for readability
179let command = "start";
180
181// GOOD - clean alignment
182switch (command) {
183    case "start":   console.log("Starting..."); break;
184    case "stop":    console.log("Stopping..."); break;
185    case "pause":   console.log("Pausing..."); break;
186    case "resume":  console.log("Resuming..."); break;
187    default:        console.log("Unknown command"); break;
188}

JavaScript Switch Statement FAQ

What is the basic syntax of a switch statement?

The basic syntax is: switch (expression) { case value1: code; break; case value2: code; break; default: code; }. The expression is evaluated once and compared with each case value using strict equality (===).

What's the difference between switch and if-else statements?

Switch is better for comparing one value against multiple discrete options. If-else is better for range checks, complex boolean logic, or when you have few conditions. Switch uses strict equality, while if-else can use any condition.

Why are break statements important in switch?

Break statements prevent 'fall-through' behavior where execution continues to the next case. Without break, all cases after the matching case will execute until a break is encountered or the switch ends.

When should I use intentional fall-through?

Use intentional fall-through when multiple cases should execute the same code. Always comment fall-through to make it clear it's intentional and not a mistake. Example: grouping weekdays or user permission levels.

Is the default case required?

The default case is optional but highly recommended. It handles unexpected values and makes your code more robust. Always include a default case unless you're absolutely certain all possible values are covered.

Can I use expressions in case values?

Case values must be constants or literals, not expressions. However, you can use switch (true) and put expressions in cases: case score >= 90:. This pattern allows range checking in switch statements.

What comparison operator does switch use?

Switch uses strict equality (===) for comparisons. This means both value and type must match. '5' (string) is different from 5 (number) in switch statements.

Can I return from a switch statement in a function?

Yes, you can use return statements in cases instead of break. When return is used, it exits both the switch and the function, so no break is needed after return.

How many cases can a switch statement have?

There's no technical limit to the number of cases, but for readability, consider alternatives like object lookups or strategy patterns if you have more than 10-15 cases. Very long switch statements can be hard to maintain.

What are some alternatives to long switch statements?

For long switch statements, consider: object lookups (obj[value]()), Map data structure, strategy pattern, or factory functions. These alternatives can be more maintainable and testable for complex conditional logic.