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
