JavaScript: Конструкция else if

Функция getTypeOfSentence() из предыдущего урока различает только вопросительные и обычные предложения. Давайте попробуем добавить поддержку восклицательных предложений:

const getTypeOfSentence = (sentence) => {
  const lastChar = sentence[sentence.length - 1];
  let sentenceType;

  if (lastChar === "!") {
    sentenceType = "exclamation";
  } else {
    sentenceType = "normal";
  }

  if (lastChar === "?") {
    sentenceType = "question";
  }

  return `Sentence is ${sentenceType}`;
};

getTypeOfSentence("Who?"); // Sentence is question
getTypeOfSentence("No"); // Sentence is normal
getTypeOfSentence("No!"); // Sentence is exclamation

Мы добавили ещё одну проверку ("exclamation" переводится «восклицание»). Технически функция работает, но с точки зрения семантики есть проблемы.

  • Проверка на наличие вопросительного знака происходит в любом случае, даже если уже был обнаружен восклицательный знак.
  • Ветка else описана именно для первого условия, но не для второго.

Правильнее будет воспользоваться ещё одной возможностью условной конструкции:

const getTypeOfSentence = (sentence) => {
  const lastChar = sentence[sentence.length - 1];
  let sentenceType;

  if (lastChar === "?") {
    sentenceType = "question";
  } else if (lastChar === "!") {
    sentenceType = "exclamation";
  } else {
    sentenceType = "normal";
  }

  return `Sentence is ${sentenceType}`;
};

getTypeOfSentence("Who?"); // Sentence is question
getTypeOfSentence("No"); // Sentence is normal
getTypeOfSentence("No!"); // Sentence is exclamation

Теперь все условия выстроены в единую конструкцию. else if — это «если не выполнено предыдущее условие, но выполнено текущее».

┌───────────┐
       │ условие 1?│
       └─────┬─────┘
      ┌──────┴──────┐
 true │             │ false
      ↓             ↓
┌───────────┐ ┌───────────┐
│  тело if  │ │ условие 2?│
└───────────┘ └─────┬─────┘
               ┌────┴──────────┐
          true │               │ false
               ↓               ↓
        ┌──────────────┐ ┌───────────┐
        │ тело else if │ │ тело else │
        └──────────────┘ └───────────┘

Логика функции: получается такая схема:

  • если последний символ это ?, то 'question'
  • иначе, если последний символ это !, то 'exclamation'
  • иначе 'normal'

Выполнится только один из блоков кода, относящихся ко всей конструкции if.

Задание

Реализуйте функцию getTrafficLightAction(color), которая принимает цвет светофора и возвращает, что нужно делать водителю:

  • 'green''go'
  • 'yellow''slow down'
  • 'red''stop'
  • любой другой цвет → 'unknown'
getTrafficLightAction("green"); // => 'go'
getTrafficLightAction("red"); // => 'stop'
getTrafficLightAction("purple"); // => 'unknown'

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются