Использование оператора switch...case в JavaScript для обработки множества условий
JavaScript

Использование оператора switch...case в JavaScript для обработки множества условий

Razilator

JavaScript - это язык программирования, который широко используется в веб-разработке. Он предоставляет различные конструкции языка для обработки условий, включая if-else и тернарный оператор. Еще одна полезная конструкция для обработки множества условий - это switch...case.

Синтаксис switch...case в JavaScript

Конструкция switch...case позволяет проверять значение переменной на соответствие нескольким вариантам. Она имеет следующий синтаксис:

index.js
switch (expression) {
  case value1:
    // Код, который будет выполнен, если expression === value1
    break;
  case value2:
    // Код, который будет выполнен, если expression === value2
    break;
  ...
  case valueN:
    // Код, который будет выполнен, если expression === valueN
    break;
  default:
    // Код, который будет выполнен, если ни один из case не соответствует expression
}

Как видно из примера, конструкция switch...case проверяет выражение expression на соответствие значениям value1, value2, ..., valueN. Если значение expression совпадает с одним из значений value1, value2, ..., valueN, будет выполнен соответствующий блок кода case.

Если ни один из блоков case не соответствует значению expression, будет выполнен блок default (если он задан).

Каждый блок case должен завершаться ключевым словом break, чтобы прервать выполнение блока switch. Если ключевое слово break пропущено, выполнение продолжится на следующий блок case, что может привести к неожиданному поведению.

Примеры switch...case в JavaScript

Рассмотрим пример использования switch...case для определения дня недели по его номеру:

index.js
let day = 2;
let dayName;

switch (day) {
  case 1:
    dayName = "Понедельник";
    break;
  case 2:
    dayName = "Вторник";
    break;
  case 3:
    dayName = "Среда";
    break;
  case 4:
    dayName = "Четверг";
    break;
  case 5:
    dayName = "Пятница";
    break;
  case 6:
    dayName = "Суббота";
    break;
  case 7:
    dayName = "Воскресенье";
    break;
  default:
    dayName = "Неизвестный день";
    break;
}

console.log(dayName);    // Выведет: "Вторник"

В этом примере значение переменной day равно 2, поэтому выполнится второй вариант (case 2), и переменной dayName будет присвоено значение "Вторник"".

Код можно переписать используя if-else конструкцию, примерно так:

index.js
let day = 2;
let dayName;

if (day === 1) {
  dayName = "Понедельник";
} else if (day === 2) {
  dayName = "Вторник";
} else if (day === 3) {
  dayName = "Среда";
} else if (day === 4) {
  dayName = "Четверг";
} else if (day === 5) {
  dayName = "Пятница";
} else if (day === 6) {
  dayName = "Суббота";
} else if (day === 7) {
  dayName = "Воскресенье";
} else {
  dayName = "Неизвестный день";
}

console.log(dayName);    // Выведет: "Вторник"

Однако, switch...case может быть более удобочитаемым и лаконичным способом написания такой логики, особенно если нужно сравнить переменную со множеством возможных значений.

Использование switch...case в React.js / Next.js / Vue.js

switch...case оператор в JavaScript часто используется вместо длинной цепочки if...else. В React.js switch...case может использоваться для управления состоянием компонентов или роутинга.

Пример использования switch...case в React.js:

components/UI/Hello.js
function DisplayMessage(props) {
  let message = '';
  switch(props.language) {
    case 'en':
      message = 'Hello!';
      break;
    case 'fr':
      message = 'Bonjour!';
      break;
    case 'es':
      message = '¡Hola!';
      break;
    case 'ru':
      message = 'Привет!';
      break;
    default:
      message = 'Hello!';
  }
  return <div>{message}</div>;
}

function App() {
  return (
    <div>
      <DisplayMessage language="en" />
      <DisplayMessage language="fr" />
      <DisplayMessage language="es" />
      <DisplayMessage language="ru" />
    </div>
  );
}

В этом примере создан компонент DisplayMessage, который принимает свойство language и возвращает сообщение на соответствующем языке. Компонент App использует DisplayMessage четыре раза, передавая разные значения для свойства language.

Рассмотрим ещё один пример для компонента Button, который может иметь разный стиль в зависимости от переданных пропсов:

components/UI/Button.js
import React from "react";
import "./Button.css";

function Button(props) {
  let className;

  switch (props.variant) {
    case "primary":
      className = "btn btn--primary";
      break;
    case "secondary":
      className = "btn btn--secondary";
      break;
    default:
      className = "btn";
      break;
  }

  return (
    <button className={className} onClick={props.onClick}>
      {props.children}
    </button>
  );
}

export default Button;

В этом примере компонент Button принимает пропс variant, который определяет стиль кнопки. Если значение пропса равно "primary", то кнопка будет иметь класс btn--primary, если "secondary" - btn--secondary. Если значение пропса не соответствует ни одному из вариантов, то кнопка будет иметь класс btn без дополнительных модификаторов.

Рассмотрим пример для Vue.js:

Можно использовать switch...case для отображения разных компонентов в зависимости от значения определенной переменной в Vue.js.

component.vue
<template>
  <div>
    <h1>{{ message }}</h1>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
import ComponentC from './ComponentC.vue';

export default {
  data() {
    return {
      currentComponent: '',
      messageType: 'success'
    }
  },
  computed: {
    message() {
      switch(this.messageType) {
        case 'success':
          this.currentComponent = ComponentA;
          return 'Success message';
        case 'warning':
          this.currentComponent = ComponentB;
          return 'Warning message';
        case 'error':
          this.currentComponent = ComponentC;
          return 'Error message';
        default:
          return 'Unknown message type';
      }s
    }
  }
}
</script>

В этом примере, компонент будет рендериться в зависимости от значения messageType, используя switch...case. Компоненты ComponentA, ComponentB, и ComponentC импортируются и передаются в качестве значений в currentComponent, которая затем используется для отображения соответствующего компонента.

;