Ветвления

1. Операторы ветвеления

Логические операторы не могут самостоятельно управлять потоком выполнения программы, для этого используются ветвления. Все они устроены по одному принципу - входные данные приводятся к булю (true или false) и, в зависимости от результата этого значения, поток программы направляется в ту или иную ветку.

2. Инструкция if

Входные данные, которые приводятся к булевому типу называются условием. Условие помещают за оператором if в круглых скобках. Если условие приводится к true, то выполняется код в фигурных скобках (ветка).

let cost = 0;
const subscription = 'pro';

if (subscription === 'pro') {
  cost = 100;
}

console.log(cost); // 100
Copy

Если условие приводится к false, код в фигурных скобках будет пропущен.

let cost = 0;
const subscription = 'free';

if (subscription === 'pro') {
  cost = 100;
}

console.log(cost); // 0
Copy

2.1. Инструкция if...else

Расширяет синтаксис оператора if тем, что в случае если условие приводится к false, выполнится код в фигурных скобках после оператора else.

let cost;
const subscription = 'free';

if (subscription === 'pro') {
  cost = 100;
} else {
  cost = 0;
}

console.log(cost); // 0
Copy

При true, оператор else и связанный с ним программный блок, игнорируются.

let cost;
const subscription = 'pro';

if (subscription === 'pro') {
  cost = 100;
} else {
  cost = 0;
}

console.log(cost); // 100
Copy

2.2. Инструкция else...if

Расширяет синтаксис оператора if...else тем, что после else снова добавляется оператор if. На первый взгляд код из множества подобных вложений кажется сложным. На самом деле, все ответвления - это результат false на все предыдущие вопросы.

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

let cost;
const subscription = 'premium';

if (subscription === 'free') {
  cost = 0;
} else if (subscription === 'pro') {
  cost = 100;
} else if (subscription === 'premium') {
  cost = 500;
} else {
  console.log('Invalid subscription type');
}

console.log(cost); // 500
Copy

3. Тернарный оператор

Есть конструкция, похожая на if...else, с упрощенным синтаксисом, называемая тернарный оператор (ternary - тройной).

{условие} ? {выражение если условие правдиво} : {выражение если условие не правдиво}
Copy

Такая конструкция работает следующим образом:

  • Вычисляется условие

  • Если условие истинно (true), вычисляется выражение после ?, в противном случае значение после :

  • Результат вычисленного выражения возвращается

let type;
const age = 20;

if (age >= 18) {
  type = 'adult';
} else {
  type = 'child';
}
Copy

Перепишем пример используя тернарный оператор.

const age = 20;
const type = age >= 18 ? 'adult' : 'child';
Copy

Запишем операцию поиска большего числа.

const num1 = 5;
const num2 = 10;
let biggerNumber;

if (num1 > num2) {
  biggerNumber = num1;
} else {
  biggerNumber = num2;
}

console.log(biggerNumber); // 10
Copy

Код работает верно, получаем большее число из двух, но это решение кажется слишком громоздким, учитывая, насколько проста проблема. Что делать? Используем тернарный оператор.

const num1 = 5;
const num2 = 10;
const biggerNumber = num1 > num2 ? num1 : num2;

console.log(biggerNumber); // 10
Copy

4. Инструкция switch

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

Значение выражения - строка или число, которое сравнивается со всеми значениями case. Если совпадения не произошло, управление передается default. Оператор break в завершении каждого блока case ставят чтобы прервать дальнейшие проверки и сразу перейти к коду за инструкцией switch.

let cost;
const subscription = 'premium';

switch (subscription) {
  case 'free':
    cost = 0;
    break;

  case 'pro':
    cost = 100;
    break;

  case 'premium':
    cost = 500;
    break;

  default:
    console.log('Invalid subscription type');
}

console.log(cost); // 500
Copy

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

Last updated