javascript
examples
examples.js⚡javascript
/**
* =====================================================
* 4.2 SWITCH STATEMENTS - EXAMPLES
* =====================================================
* Multi-way branching based on value matching
*/
// =====================================================
// 1. BASIC SWITCH STATEMENT
// =====================================================
console.log('--- Basic Switch ---');
const day = 3;
let dayName;
switch (day) {
case 1:
dayName = 'Monday';
break;
case 2:
dayName = 'Tuesday';
break;
case 3:
dayName = 'Wednesday';
break;
case 4:
dayName = 'Thursday';
break;
case 5:
dayName = 'Friday';
break;
case 6:
dayName = 'Saturday';
break;
case 7:
dayName = 'Sunday';
break;
default:
dayName = 'Invalid day';
}
console.log(`Day ${day} is ${dayName}`);
// =====================================================
// 2. STRING CASES
// =====================================================
console.log('\n--- String Cases ---');
const fruit = 'apple';
switch (fruit) {
case 'apple':
console.log('Apples are $1.50/lb');
break;
case 'banana':
console.log('Bananas are $0.75/lb');
break;
case 'orange':
console.log('Oranges are $2.00/lb');
break;
case 'grape':
console.log('Grapes are $3.00/lb');
break;
default:
console.log("We don't have that fruit");
}
// =====================================================
// 3. THE DEFAULT CASE
// =====================================================
console.log('\n--- Default Case ---');
const color = 'purple';
switch (color) {
case 'red':
console.log('Stop!');
break;
case 'yellow':
console.log('Caution!');
break;
case 'green':
console.log('Go!');
break;
default:
console.log(`Unknown color: ${color}`);
}
// =====================================================
// 4. FALL-THROUGH BEHAVIOR
// =====================================================
console.log('\n--- Fall-Through (WITHOUT break) ---');
const letter = 'b';
// Without break - demonstrates fall-through
switch (letter) {
case 'a':
console.log('Case a');
// No break - falls through!
case 'b':
console.log('Case b');
// No break - falls through!
case 'c':
console.log('Case c');
// No break - falls through!
default:
console.log('Default case');
}
// Output: "Case b", "Case c", "Default case"
// =====================================================
// 5. GROUPING CASES
// =====================================================
console.log('\n--- Grouping Cases ---');
// Checking for vowels
const char = 'E';
switch (char.toLowerCase()) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
console.log(`'${char}' is a vowel`);
break;
default:
console.log(`'${char}' is a consonant`);
}
// Grouping days
const dayOfWeek = 'Saturday';
switch (dayOfWeek) {
case 'Monday':
case 'Tuesday':
case 'Wednesday':
case 'Thursday':
case 'Friday':
console.log("It's a weekday - time to work!");
break;
case 'Saturday':
case 'Sunday':
console.log("It's the weekend - time to relax!");
break;
default:
console.log('Invalid day');
}
// Seasons by month
const month = 7;
switch (month) {
case 12:
case 1:
case 2:
console.log('Winter');
break;
case 3:
case 4:
case 5:
console.log('Spring');
break;
case 6:
case 7:
case 8:
console.log('Summer');
break;
case 9:
case 10:
case 11:
console.log('Fall');
break;
default:
console.log('Invalid month');
}
// =====================================================
// 6. RETURN FROM SWITCH (in functions)
// =====================================================
console.log('\n--- Return from Switch ---');
function getHttpStatusText(code) {
switch (code) {
case 200:
return 'OK';
case 201:
return 'Created';
case 204:
return 'No Content';
case 400:
return 'Bad Request';
case 401:
return 'Unauthorized';
case 403:
return 'Forbidden';
case 404:
return 'Not Found';
case 500:
return 'Internal Server Error';
case 502:
return 'Bad Gateway';
case 503:
return 'Service Unavailable';
default:
return 'Unknown Status';
}
}
console.log(`200: ${getHttpStatusText(200)}`);
console.log(`404: ${getHttpStatusText(404)}`);
console.log(`999: ${getHttpStatusText(999)}`);
// =====================================================
// 7. SWITCH ON EXPRESSIONS
// =====================================================
console.log('\n--- Switch on Expressions ---');
// Switch on typeof
function describeType(value) {
switch (typeof value) {
case 'string':
return `String with ${value.length} characters`;
case 'number':
return `Number: ${value}`;
case 'boolean':
return `Boolean: ${value}`;
case 'object':
if (value === null) return 'null';
if (Array.isArray(value)) return `Array with ${value.length} items`;
return 'Object';
case 'undefined':
return 'undefined';
case 'function':
return 'Function';
default:
return 'Unknown type';
}
}
console.log(describeType('hello'));
console.log(describeType(42));
console.log(describeType([1, 2, 3]));
console.log(describeType({ name: 'John' }));
// =====================================================
// 8. SWITCH(TRUE) PATTERN
// =====================================================
console.log('\n--- Switch(true) Pattern ---');
// Use switch(true) for range comparisons
function getGrade(score) {
switch (true) {
case score >= 90:
return 'A';
case score >= 80:
return 'B';
case score >= 70:
return 'C';
case score >= 60:
return 'D';
default:
return 'F';
}
}
console.log(`Score 95: ${getGrade(95)}`);
console.log(`Score 82: ${getGrade(82)}`);
console.log(`Score 55: ${getGrade(55)}`);
// Temperature description
function describeTemperature(temp) {
switch (true) {
case temp < 0:
return 'Freezing';
case temp < 10:
return 'Cold';
case temp < 20:
return 'Cool';
case temp < 30:
return 'Warm';
default:
return 'Hot';
}
}
console.log(`10°C: ${describeTemperature(10)}`);
console.log(`25°C: ${describeTemperature(25)}`);
console.log(`-5°C: ${describeTemperature(-5)}`);
// =====================================================
// 9. ACTION HANDLERS (Redux-style)
// =====================================================
console.log('\n--- Action Handler Pattern ---');
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { ...state, count: state.count + 1 };
case 'DECREMENT':
return { ...state, count: state.count - 1 };
case 'ADD':
return { ...state, count: state.count + action.payload };
case 'RESET':
return { ...state, count: 0 };
case 'SET_NAME':
return { ...state, name: action.payload };
default:
return state;
}
}
let state = { count: 0, name: 'Counter' };
console.log('Initial:', state);
state = reducer(state, { type: 'INCREMENT' });
console.log('After INCREMENT:', state);
state = reducer(state, { type: 'ADD', payload: 5 });
console.log('After ADD 5:', state);
state = reducer(state, { type: 'SET_NAME', payload: 'My Counter' });
console.log('After SET_NAME:', state);
// =====================================================
// 10. STATE MACHINE
// =====================================================
console.log('\n--- State Machine ---');
function trafficLight(currentState, event) {
switch (currentState) {
case 'red':
switch (event) {
case 'timer':
return 'green';
default:
return currentState;
}
case 'green':
switch (event) {
case 'timer':
return 'yellow';
default:
return currentState;
}
case 'yellow':
switch (event) {
case 'timer':
return 'red';
default:
return currentState;
}
default:
return 'red'; // Default state
}
}
let lightState = 'red';
console.log(`Current: ${lightState}`);
lightState = trafficLight(lightState, 'timer');
console.log(`After timer: ${lightState}`); // green
lightState = trafficLight(lightState, 'timer');
console.log(`After timer: ${lightState}`); // yellow
lightState = trafficLight(lightState, 'timer');
console.log(`After timer: ${lightState}`); // red
// =====================================================
// 11. BRACES FOR COMPLEX CASES
// =====================================================
console.log('\n--- Complex Cases with Braces ---');
function processCommand(cmd) {
switch (cmd) {
case 'create': {
const id = Math.random().toString(36).substr(2, 9);
const timestamp = new Date().toISOString();
return { id, timestamp, status: 'created' };
}
case 'validate': {
const isValid = Math.random() > 0.5;
const message = isValid ? 'Valid' : 'Invalid';
return { isValid, message };
}
case 'process': {
const steps = ['init', 'compute', 'finalize'];
const results = steps.map((s) => `${s}: done`);
return { steps: results };
}
default: {
return { error: `Unknown command: ${cmd}` };
}
}
}
console.log(processCommand('create'));
console.log(processCommand('validate'));
console.log(processCommand('unknown'));
// =====================================================
// 12. INTENTIONAL FALL-THROUGH
// =====================================================
console.log('\n--- Intentional Fall-Through ---');
function handleKey(key) {
switch (key) {
case 'ArrowUp':
case 'w':
case 'W':
console.log('Move up');
break;
case 'ArrowDown':
case 's':
case 'S':
console.log('Move down');
break;
case 'ArrowLeft':
case 'a':
case 'A':
console.log('Move left');
break;
case 'ArrowRight':
case 'd':
case 'D':
console.log('Move right');
break;
case 'Enter':
case ' ': // Space
console.log('Action!');
break;
default:
console.log(`Unknown key: ${key}`);
}
}
handleKey('w'); // "Move up"
handleKey('ArrowRight'); // "Move right"
handleKey('Enter'); // "Action!"
// =====================================================
// 13. OBJECT LOOKUP ALTERNATIVE
// =====================================================
console.log('\n--- Object Lookup Alternative ---');
// Switch version
function getAnimalSoundSwitch(animal) {
switch (animal.toLowerCase()) {
case 'dog':
return 'Woof!';
case 'cat':
return 'Meow!';
case 'cow':
return 'Moo!';
case 'bird':
return 'Tweet!';
default:
return 'Unknown sound';
}
}
// Object lookup version (often cleaner)
const animalSounds = {
dog: 'Woof!',
cat: 'Meow!',
cow: 'Moo!',
bird: 'Tweet!',
};
function getAnimalSoundObject(animal) {
return animalSounds[animal.toLowerCase()] || 'Unknown sound';
}
console.log('Switch:', getAnimalSoundSwitch('Dog'));
console.log('Object:', getAnimalSoundObject('Dog'));
// =====================================================
// 14. STRICT EQUALITY DEMONSTRATION
// =====================================================
console.log('\n--- Strict Equality ---');
const stringFive = '5';
switch (stringFive) {
case 5:
console.log('Matched number 5');
break;
case '5':
console.log("Matched string '5'");
break;
default:
console.log('No match');
}
// Output: "Matched string '5'"
// =====================================================
// SUMMARY
// =====================================================
console.log('\n--- Summary ---');
console.log(`
Switch Statement Features:
- Uses strict equality (===)
- Requires break to stop fall-through
- default handles unmatched cases
- Cases can be grouped (share code)
- switch(true) enables range comparisons
Common Use Cases:
- Menu/command handling
- State machines
- Type-based processing
- Day/month/status lookups
- Redux-style action handlers
`);