Функция переключения кажется старым и уродливым способом написания кода. Логика провала выглядела прекрасно рядом с goto и метками, но она просто неуместна в современном javascript. Я собираюсь показать вам, как полностью избежать их использования. (примечание: просмотрите сводку, если вам просто нужен ответ!)

Во-первых, давайте посмотрим на пример оператора switch:

function switchFunction(value) {
  switch(value){
    case 1:
      return "one";
      break;
    case 2:
      return "two";
      break;
    case "chicken":
      return "chicken"
      break;
    case 4:
    case 5:
      return "greater then 4";
      break;
    default:
      return `I do not know what ${value} is`;
      break;
  }
}

Некоторые ключевые функции, которые мы собираемся воспроизвести:

  1. Переключатели падают вниз до разрыва, поэтому, если значение равно 4, 5 или 6, это приведет к журналу «больше 4».
  2. Если значение не распознано, будет возвращено значение по умолчанию.
  3. Каждый случай нуждается в перерыве, если вы не хотите, чтобы он упал до следующего состояния.

Все это очень противоречит современным практикам кодирования. Вам не нужно явно указывать функции прерываться, она должна игнорировать остальные случаи, поскольку они не соответствуют действительности. Кроме того, несмотря на то, что использование логики провала может иметь некоторую ценность, теперь у нас есть лучшие способы справиться с такими ситуациями.

В качестве альтернативы вы можете создать функцию, которая передает это объекту. Вот пример:

switchObject = {
  1: "one",
  2: "two",
  "chicken": (() => "chicken")(),
  4: (x = "greater then 4"),
  5: x,
  6: x
}
---
switchObject[1] // "one"
switchObject["chicken"] // "chicken"
switchObject[200] // "undefined"

Хотя эта функция заставляет вас определять каждое условие, это гораздо более чистая реализация.

  • 'chicken" показывает, как вы можете реализовать функцию, которую не могут сделать переключатели.
  • 5 и 6 показывают, как несколько объектов возвращают одно и то же значение. 4 определяет const x = "greater then "4", который используют 5 и 6.

Единственная проблема с этим кодом заключается в том, что он не предоставляет опции «по умолчанию» и вместо этого возвращает неопределенное значение, если не может найти свойство. Если требуется значение по умолчанию, вы можете обернуть этот объект в функцию, которая обрабатывает такие исключения:

switchFunction = (value) =>  switchObject[value] || `I do not know what ${value} is`;
--
switchFunction(1) // "one"
switchFunction("chicken") // "chicken"
switchFunction(200) // "I do not know what 200 is"

Функция просто возвращает объект, если он определен, и в противном случае возвращает то, что находится в правой части оператора ИЛИ. В сводке показано, как избавиться от определения объекта отдельно от определения функции.

Резюме

Мы можем объединить все это в это:

switchFunction = (value) => ({
  1: "one",
  2: "two",
  "chicken": (() => "chicken")(),
  4: (v = "greater then 4"),
  5: v,
  6: v
}[value] ||  `I do not know what ${value} is`)
---
switchFunction(1) // "one"
switchFunction("chicken") // "chicken"
switchFunction(5) // "greater then 4"
switchFunction(200) // "I do not know what 200 is"

И теперь вы взяли более 20 строк кода и упростили его до 8!