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'Полезное
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'Полезное
Ваше упражнение проверяется по этим тестам
import { expect, test } from "vitest";
import f from "./index.js";
test("else if", () => {
expect(f("green")).toBe("go");
expect(f("yellow")).toBe("slow down");
expect(f("red")).toBe("stop");
expect(f("blue")).toBe("unknown");
expect(f("purple")).toBe("unknown");
});Решение учителя откроется через:
20:00
