Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 69 additions & 16 deletions modules/48-conditionals/30-if/ru/README.md
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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` нужен там, где внутри блока выполняются дополнительные действия помимо возврата результата. Чем сложнее программы, тем чаще такие ситуации будут встречаться.
32 changes: 32 additions & 0 deletions modules/48-conditionals/40-if-else/ru/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 19 additions & 1 deletion modules/48-conditionals/50-else-if/ru/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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'`
Expand Down
Loading