Розгалуження алгоритму if

Розгалуження if, умови

Алгоритм розгалужується коли зустрічає умову.

Умова - це питання, на яке можна дати відповідь "так" чи "ні".

В залежності від відповіді алгоритм слідує по одній з двох гілок, виконуючи відповідні команди.

Після виконання команд обидві гілки можуть зійтися або не сходитися до кінця роботи програми.

Одна з гілок може бути порожньою, не містити команд.

Оператори.

== - рівність;

=== - строга рівність;

!= - не рівність;

!== - строга не рівність;

<, >, <=, >= - порівняння;

|| - або;

&& - та;

! - заперечення.

Конструкція умови.

if ( умова ) {
  // тіло умови, гілка true, виконуємо:
  команда;
  команда;
  ...
}
// гілка false відсутня

if ( умова ) {
  // тіло умови, гілка true, виконуємо:
  команда;
  команда;
  ...
} else {
  // тіло умови, гілка false, виконуємо:
  команда;
  команда;
  ...
}

Приклади умов:

var a = 1;

if (a === 1) {
  alert('Ha-ha-ha!');
}

if (a > 1) {
  alert('Ha-ha-ha!');
} else {
  alert('Ho-ho-ho!');
}

Умови можна комбінувати, використовуючи скобки чи без них.

Приорітетність - порядок виконання дій. Якщо у операторів однакова приоритетність - дії виконуються почергово зліва направо.

операції в дужках ( )
унарні оператори ++, --, -, !
арифметичні оператори *, /, %, +, -
оператори порівняння > < == і т.д.
логічні оператори &&, ||
тернарний оператор ? :
оператор присвоювання

if (a>b && c<6 || m=="none") { ... }
if (a>!b && (c<6 || m=="none")) { ... }

Типи даних в умовах.

Наступні типи даних в якості умови вважаються false:

var a = 0,
    b = '',
    c = undefined,
    d = NaN,
    e = null;
if (a) { console.log('a is true'); } else { console.log('a is false'); }
if (b) { console.log('b is true'); } else { console.log('b is false'); }
if (c) { console.log('c is true'); } else { console.log('c is false'); }
if (d) { console.log('d is true'); } else { console.log('d is false'); }
if (e) { console.log('e is true'); } else { console.log('e is false'); }

Решта типів даних - це true:

var a = 0.1,
    b = '0',
    c = [],
    d = {},
    e = function() {};
if (a) { console.log('a is true'); } else { console.log('a is false'); }
if (b) { console.log('b is true'); } else { console.log('b is false'); }
if (c) { console.log('c is true'); } else { console.log('c is false'); }
if (d) { console.log('d is true'); } else { console.log('d is false'); }
if (e) { console.log('e is true'); } else { console.log('e is false'); }

Уникайте помилок в умовах:

var a = 0;
console.log(a === 1);
console.log(a == 1);
console.log(a = 1);

// умови, що завжди повертатимуть true та false, так як повертають 1 та 0:
if (a = 1) { ... }
if (a = 0) { ... }

Умова магістра Йоди - в одиницю неможливо присвоїти значення змінної a. Інтерпритатор викличе помилку. Якщо ж переставити місцями змінну та одиницю - таку помилку важко знайти в коді, інтерпритатор не сповістить про помилку.

if (1 == a) { ... }

if (1 = a) { ... } /* error */

Тернарний оператор умови.

Тернарний оператор в залежності від відповіді на умову повертає або значення_А, або значення_Б:

умова ? значення_А : значення_Б

console.log(age > 17 ? 'adult' : 'child');

var s = a === b ? 42 : 13;

// повний варіант умови:
var s;
if (a === b) {
  s = 42;
} else {
  s = 13;
}

Повернення результату операторами "або" і "та".

Оператори "або", "та" не завжди повертають значення true чи false. Виконайте наступний код та проаналізуйте результат:

console.groupCollapsed('Test OR with num');
console.log(5 || 6);
console.log(5 || 0);
console.log(0 || 6);
console.log(0 || 0);
console.groupEnd();

console.groupCollapsed('Test OR with str');
console.log('hey' || 'ho');
console.log('hey' || '');
console.log('' || 'ho');
console.log('' || '');
console.groupEnd();

console.groupCollapsed('Test AND with num');
console.log(5 && 6);
console.log(5 && 0);
console.log(0 && 6);
console.log(0 && 0);
console.groupEnd();

console.groupCollapsed('Test AND with str');
console.log('hey' && 'ho');
console.log('hey' && '');
console.log('' && 'ho');
console.log('' && '');
console.groupEnd();

Резюме (мова про операнди оператора):

OR:
  перший true:  повернути перший
  перший false: повернути другий
AND:
  перший true:  повернути другий
  перший false: повернути перший

 

Switch (case).

Якщо є декілька гілок розгалуження, то можна використовувати або конструкцію else-if, або switch (case):

if (a == 1) {
  ...
} else if (a == 2) {
  ...
} else if (a == 'ok') {
  ...
} else {
  ...
}

switch (a) {
  case 1:
    ...
  case 2:
    ...
  case 'ok':
    ...
  default:
    ...
}

Проте, ці два записи не є еквівалентними. Розглянемо ситуацію, коли внутрішні команди змінюють змінну a:

var a = 4;
if (a === 4) {
  a = 5;
  console.log('if 4');
} else if (a === 5) {
  a = 6;
  console.log('if 5');
}

var a = 4;
switch (a) {
  case 4:
    a = 5;
    console.log('switch 4');
  case 5:
    a = 6;
    console.log('switch 5');
}

Щоб ці дві конструкції зробити еквівалентними - в кожній умові switch потрібно використовувати команду break, що перериває роботу поточної конструкції:

var a = 4;
switch (a) {
  case 4:
    a = 5;
    console.log('switch 4');
    break;
  case 5:
    a = 6;
    console.log('switch 5');
    break;
}

Домашнє завдання

  1. Створіть умову, яка буде завжди виконуватися. В тілі умови виводьте повідомлення "Привіт!".
  2. Подивіться на годинник і запишіть у змінну m кількість хвилин.
    В залежності від цього значення виведіть в консоль одне з повідомленнь: Перша половина години
    Друга половина години
    Змініть m так, щоб вивести інше повідомлення.
  3. В корзині n яблук. Виведіть повідомлення, якщо корзина буде порожньою: Нажаль, корзина порожня. Умова повинна бути якнайкоротша.
  4. Тернарним оператором виведіть на екран одне з двох повідомлень: Корзина порожня.
    Корзина не порожня.
    Тут і надалі міняйте змінну так, щоб протестувати всі варіанти.
  5. Виведіть на екран повідомлення, якщо в корзині від двох до п'яти яблук: В корзині декілька яблук
  6. Виведіть на екран повідомлення, якщо це правда: Кількість яблук в корзині ділиться на 3 чи на 7.