javascript

examples

examples.js
/**
 * =====================================================
 * 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
`);
Examples - JavaScript Tutorial | DeepML