diff --git a/modules/48-conditionals/30-if/ru/README.md b/modules/48-conditionals/30-if/ru/README.md index cff73f51..c3832b69 100644 --- a/modules/48-conditionals/30-if/ru/README.md +++ b/modules/48-conditionals/30-if/ru/README.md @@ -1,18 +1,28 @@ -Иногда нужно выполнить код только при определённом условии. Для этого используется оператор `if`. +Логические выражения позволяют проверять разные условия, но сами по себе они лишь возвращают `true` или `false`. Чтобы программа могла выполнять разные действия в зависимости от результата, в JavaScript есть специальная конструкция `if`. ```javascript -function checkAge(age) { - if (age >= 18) { - console.log('Вход разрешён'); - } +if (5 > 3) { + console.log('Yes, it is true'); } +``` -checkAge(20); // => Вход разрешён -checkAge(15); // (ничего не выводит) +Здесь строка `'Yes, it is true'` напечатается, потому что условие `5 > 3` истинно. + +```text +┌───────────┐ +│ условие? │ +└─────┬─────┘ + true │ + ↓ +┌───────────┐ +│ тело if │ +└───────────┘ ``` ## Синтаксис +После `if` в круглых скобках записывается условие, а тело — в фигурных скобках: + ```javascript if (условие) { // блок выполняется, если условие true @@ -21,18 +31,61 @@ if (условие) { Условие — это любое выражение, которое приводится к `true` или `false`. -## Если условие ложно +## Блоки кода -Если условие `false`, блок `if` пропускается. Код после блока выполняется всегда. +Всё, что находится внутри фигурных скобок `{}`, относится к телу `if`. Код после блока выполняется в любом случае: ```javascript -function guessNumber(guess) { - if (guess === 42) { - return 'You win!'; - } - return 'Try again!'; +if (10 === 10) { + console.log('First'); + console.log('Second'); } -console.log(guessNumber(42)); // => You win! -console.log(guessNumber(7)); // => Try again! +console.log('Goodbye!'); +``` + +Здесь напечатаются `First` и `Second`, потому что условие выполнилось. А `Goodbye!` напечатается всегда, так как эта строка уже за пределами блока. Принцип такой же, как и в определении функций. + +## Использование if внутри функции + +Рассмотрим функцию, которая определяет тип переданного предложения. Если оно оканчивается знаком вопроса, функция вернёт `'question'`, иначе — `'normal'`: + +```javascript +const getTypeOfSentence = (sentence) => { + if (sentence.endsWith('?')) { + return 'question'; + } + return 'normal'; +}; + +console.log(getTypeOfSentence('Hodor')); // => normal +console.log(getTypeOfSentence('Hodor?')); // => question ``` + +Здесь используются сразу два `return`. Если условие внутри `if` выполняется, срабатывает `return 'question'` и функция завершается. Если условие не выполняется, управление переходит на следующую строку с `return 'normal'`. + +Таким образом, у функции есть несколько возможных точек выхода. Это частая практика: в зависимости от условий функция может завершаться по-разному. + +Несмотря на то что функция `getTypeOfSentence` использует `if`, она возвращает строки, а значит предикатом не является. В качестве предиката рассмотрим функцию, которая проверяет, достаточно ли денег для покупки: + +```javascript +const hasEnoughMoney = (balance, price) => { + if (balance >= price) { + return true; + } + return false; +}; + +console.log(hasEnoughMoney(100, 50)); // => true +console.log(hasEnoughMoney(30, 50)); // => false +``` + +## if и логические выражения + +Функцию `hasEnoughMoney` мы написали через `if`. Но в таком виде она могла бы обойтись и без него, потому что результат сравнения сам по себе уже является логическим выражением: + +```javascript +const hasEnoughMoney = (balance, price) => balance >= price; +``` + +В простых случаях лучше сразу возвращать такое выражение. `if` нужен там, где внутри блока выполняются дополнительные действия помимо возврата результата. Чем сложнее программы, тем чаще такие ситуации будут встречаться. diff --git a/modules/48-conditionals/40-if-else/ru/README.md b/modules/48-conditionals/40-if-else/ru/README.md index 974d2729..d34744a0 100644 --- a/modules/48-conditionals/40-if-else/ru/README.md +++ b/modules/48-conditionals/40-if-else/ru/README.md @@ -32,6 +32,38 @@ const getTypeOfSentence = (sentence) => { Мы добавили ключевое слово `else` и новый блок с фигурными скобками. Этот блок выполнится, только если условие в `if` — ложь. +```text + ┌───────────┐ + │ условие? │ + └─────┬─────┘ + true │ │ false + ↓ ↓ +┌──────────┐ ┌──────────┐ +│ тело if │ │ тело else│ +└──────────┘ └──────────┘ +``` + +## Вложенные условия + +В блок `else` (как и в блок `if`) можно вкладывать другие условия. Благодаря фигурным скобкам вложенность всегда видна явно: + +```javascript +const number = 10; + +if (number > 10) { + console.log('Number is greater than 10'); +} else { + if (number === 10) { + console.log('Number is exactly 10'); + } else { + console.log('Number is less than 10'); + } +} +// => Number is exactly 10 +``` + +Здесь сначала проверяется `number > 10`. Условие ложно, поэтому управление переходит в `else`, где проверяется вложенное условие `number === 10`. Оно истинно — печатается `Number is exactly 10`. + Существует два способа оформления конструкции *if-else*. С помощью отрицания можно изменить порядок блоков: ```javascript diff --git a/modules/48-conditionals/50-else-if/ru/README.md b/modules/48-conditionals/50-else-if/ru/README.md index 5b07c51e..36e0eab9 100644 --- a/modules/48-conditionals/50-else-if/ru/README.md +++ b/modules/48-conditionals/50-else-if/ru/README.md @@ -52,7 +52,25 @@ getTypeOfSentence('No'); // Sentence is normal getTypeOfSentence('No!'); // Sentence is exclamation ``` -Теперь все условия выстроены в единую конструкцию. `else if` — это «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема: +Теперь все условия выстроены в единую конструкцию. `else if` — это «если не выполнено предыдущее условие, но выполнено текущее». + +```text + ┌─────────────────┐ + │ условие 1? │ + └────┬────────┬───┘ + true │ │ false + ↓ ↓ +┌──────────┐ ┌─────────────────┐ +│ тело if │ │ условие 2? │ +└──────────┘ └────┬────────┬───┘ + true │ │ false + ↓ ↓ + ┌────────────┐ ┌──────────┐ + │тело else if│ │ тело else│ + └────────────┘ └──────────┘ +``` + +Логика функции: получается такая схема: - если последний символ это `?`, то `'question'` - иначе, если последний символ это `!`, то `'exclamation'`