Розгалуження алгоритму 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;
}
Домашнє завдання
- Створіть умову, яка буде завжди виконуватися. В тілі умови виводьте повідомлення "Привіт!".
-
Подивіться на годинник і запишіть у змінну m кількість хвилин.
В залежності від цього значення виведіть в консоль одне з повідомленнь:Перша половина годиниЗмініть m так, щоб вивести інше повідомлення.
Друга половина години -
В корзині n яблук. Виведіть повідомлення, якщо корзина буде порожньою:
Нажаль, корзина порожня.Умова повинна бути якнайкоротша. -
Тернарним оператором виведіть на екран одне з двох повідомлень:
Корзина порожня.Тут і надалі міняйте змінну так, щоб протестувати всі варіанти.
Корзина не порожня. -
Виведіть на екран повідомлення, якщо в корзині від двох до п'яти яблук:
В корзині декілька яблук -
Виведіть на екран повідомлення, якщо це правда:
Кількість яблук в корзині ділиться на 3 чи на 7.