Клавиша / esc

if...else

В зависимости от условия выполняет один или другой вариант кода.

Время чтения: 5 мин

Кратко

Скопировано

Управляющая конструкция. В зависимости от условия выбирает, какой блок кода выполнить.

Как пишется

Скопировано
  • Выполнить один, либо другой блок кода, в зависимости от условия:
        
          
          if (условие) {  console.log('выполнится, если условие истинное (true)')} else {  console.log('выполнится, если условие ложное (false)')}
          if (условие) {
  console.log('выполнится, если условие истинное (true)')
} else {
  console.log('выполнится, если условие ложное (false)')
}

        
        
          
        
      
  • Выполнить блок кода, если условие истинное, либо пропустить его:
        
          
          if (условие) {  console.log('выполнюсь, если условие истинное')}
          if (условие) {
  console.log('выполнюсь, если условие истинное')
}

        
        
          
        
      
  • Выполнить блок кода, у которого условие истинное и находится выше всего в списке, остальные проверки проигнорировать:
        
          
          if (условие1) {  // ...} else if (условие2) {  // ...} else if (условие3) {  // ...} else {  // выполнится, если все условия выше были ложными}
          if (условие1) {
  // ...
} else if (условие2) {
  // ...
} else if (условие3) {
  // ...
} else {
  // выполнится, если все условия выше были ложными
}

        
        
          
        
      

Как понять

Скопировано

Зачем нужны управляющие конструкции, читайте в статье «Порядок выполнения».

В разработке много задач, в которых нужно по-разному обрабатывать данные. Все эти примеры описываются фразой «если ..., то ...»:

  • если пользователь вошёл в систему, то показать содержание почтового ящика. В противном случае — форму логина.
  • если сумма покупки больше 2000₽, то посчитать скидку 10%.
  • если покупка оплачена, то показать экран успеха. В противном случае — экран с ошибкой.

Фразой «если ...» определяется условие. Если условие выполняется, то мы выполняем часть, описанную фразой «то...». Если условие не выполняется, то нужно смотреть на фразу «В противном случае ...», когда она есть.

Если мы хотим решать подобные задачи с помощью кода, то язык программирования должен содержать аналогичные конструкции. Конструкция должна выбирать, какой код выполнять, в зависимости от условия. Такая конструкция называется if...else. Она предоставляет возможность ветвления.

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

        
          
          if (условие) {  // блок кода, выполнится если условие выполняется} else {  // блок кода, выполнится в противном случае}
          if (условие) {
  // блок кода, выполнится если условие выполняется
} else {
  // блок кода, выполнится в противном случае
}

        
        
          
        
      
Схема работы if...else

Пример ниже выведет на печать слово «Привет», если во всплывающее окно ввести «Друг» и «Я тебя не знаю» в противном случае:

        
          
          let phrase = prompt('Скажи слово друг и заходи')if (phrase === 'Друг') {  alert('Привет')} else {  alert('Я тебя не знаю')}
          let phrase = prompt('Скажи слово друг и заходи')

if (phrase === 'Друг') {
  alert('Привет')
} else {
  alert('Я тебя не знаю')
}

        
        
          
        
      

Условие

Скопировано

Для того чтобы хорошо понимать if, нужно разобраться с понятием условие. Условие — это выражение, которое JavaScript вычислит в значение.

В самом простом случае, условие должно вычисляться в логический тип данных: true, либо false. Такие выражения получаются при использовании операторов сравнения ==, ===, >, <, >=, <=, !==, !=.

Например:

        
          
          // применяем скидку, если цена больше или равна 2500 рублейif (price >= 2500) {  price = price * 0.9}if (foundItems === 0) {  console.log('Ничего не найдено')} else {  console.log('печатаем результаты поиска')}if (user.isAdmin) {  // сокращенная запись user.isAdmin === true  console.log('Привет, админ!')} else {  console.log('Привет, пользователь!')}
          // применяем скидку, если цена больше или равна 2500 рублей
if (price >= 2500) {
  price = price * 0.9
}

if (foundItems === 0) {
  console.log('Ничего не найдено')
} else {
  console.log('печатаем результаты поиска')
}

if (user.isAdmin) {
  // сокращенная запись user.isAdmin === true
  console.log('Привет, админ!')
} else {
  console.log('Привет, пользователь!')
}

        
        
          
        
      

Выражения в условии можно комбинировать с помощью логических операторов.

В более сложном случае условие будет вычисляться в какой-либо другой тип: число, строку, массив, объект и так далее. В этом случае JavaScript будет приводить получившееся значение к логическому типу.

Какой из блоков кода выполнится?

        
          
          let foundItems = 0if (foundItems) {  console.log('Ничего не найдено')} else {  console.log('печатаем результаты поиска')}
          let foundItems = 0

if (foundItems) {
  console.log('Ничего не найдено')
} else {
  console.log('печатаем результаты поиска')
}

        
        
          
        
      

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

Все, что не приводится к false, будет true

Осталось запомнить 8 значений, которые приводятся к false:

Зная это правило, мы поймём, что в примере выше есть баг: мы будем писать «Ничего не найдено» всегда, кроме случая, когда в переменной foundItems окажется 0. Тогда мы попытаемся напечатать результаты поиска.

Вариации

Скопировано

if без else

Скопировано

Если мы хотим выполнить действие, когда условие верно, но в противном случае не делать ничего, то достаточно написать только іf без блока else.

Напечатаем приветствие только Виктору, для других не делаем ничего:

        
          
          if (username === 'Виктор') {  console.log('Привет, Витёк! Эта пасхалка для тебя')}
          if (username === 'Виктор') {
  console.log('Привет, Витёк! Эта пасхалка для тебя')
}

        
        
          
        
      

if ... else if ... else

Скопировано

Задача может содержать больше чем два случая. Для её решения можно собирать if...else в цепочки:

Например, в зависимости от статуса пользователя менять размер скидки:

        
          
          let discount = 0if (userStatus === 'VIP') {  discount = 25} else if (userStatus === 'privileged') {  discount = 15} else if (userStatus === 'clubMember') {  discount = 5}
          let discount = 0
if (userStatus === 'VIP') {
  discount = 25
} else if (userStatus === 'privileged') {
  discount = 15
} else if (userStatus === 'clubMember') {
  discount = 5
}

        
        
          
        
      

В этом случае выполнится тот блок кода, условие которого истинное и находится выше по коду. Остальные условия будут проигнорированы.

Когда условий становится много, то страдает читаемость кода. В этом случае лучше писать switch, но он подходит не всегда.

На практике

Скопировано

Николай Лопин советует

Скопировано

🛠 Если нужно сохранить в переменную одно, либо другое значение, в зависимости от условия, то можно это сделать двумя путями.

Простой:

        
          
          let value = 1 // значение по умолчаниюif (day === 'Tuesday') {  value = 50}
          let value = 1 // значение по умолчанию
if (day === 'Tuesday') {
  value = 50
}

        
        
          
        
      

С использованием тернарного оператора (короткая запись if..else):

        
          
          let value = day === 'Tuesday' ? 50 : 1 // во вторник значение 50, во всех остальных случаях 1
          let value = day === 'Tuesday' ? 50 : 1 // во вторник значение 50, во всех остальных случаях 1

        
        
          
        
      

Тернарный оператор стоит использовать только если выражение короткое. В противном случае такой код будет плохо читаться.

Роман Баранников советует

Скопировано

🛠 Частая задача — вызвать функцию при выполнении условия. Для этого можно использовать трюк с логическим И &&:

Простая реализация:

        
          
          const processTuesday = () => {  // ...полезный код}if (day === 'Вторник') {  processTuesday()}
          const processTuesday = () => {
  // ...полезный код
}

if (day === 'Вторник') {
  processTuesday()
}

        
        
          
        
      

Более короткая и лаконичная запись:

        
          
          day === 'Вторник' && processTuesday()
          day === 'Вторник' && processTuesday()

        
        
          
        
      

В таком коде функция processTuesday() будет вызвана только в тех случаях, когда первое выражение day === 'Вторник' будет true. Если же выражение будет false, то вторая часть выражения — processTuesday() не будет вычисляться совсем, потому что вычисления первого выражения достаточно, чтобы получить результат всего выражения с логическим И — оно будет false. Такой подход называется вычислением по короткой схеме и используется, чтобы не выполнять лишней работы.

Александр Леоненко советует

Скопировано

🛠 Частый паттерн — установить значение по умолчанию, если в переменной нет значения. Можно сделать так:

        
          
          let value = 0 // значение по умолчаниюif (externalValue) {  value = externalValue // установить значение, если в externalValue что-либо хранится}
          let value = 0 // значение по умолчанию

if (externalValue) {
  value = externalValue // установить значение, если в externalValue что-либо хранится
}

        
        
          
        
      

Код можно сократить, воспользовавшись операцией логического ИЛИ ||.

Если externalValue не объявлен, то значение установится в 0:

        
          
          const value = externalValue || 0
          const value = externalValue || 0

        
        
          
        
      

Неявное приведение externalValue к логическому типу также игнорирует определённые ложные значения, возможно, вполне валидные: '', NaN, 0 , -0, 0n, false. Чтобы их не терять, нужно вместо || использовать ?? — новый, уже неплохо поддерживаемый логический оператор nullish coalescing из ES2020:

        
          
          const value = externalValue ?? 42
          const value = externalValue ?? 42

        
        
          
        
      

Что будет аналогично записи:

        
          
          const value = (externalValue !== null && externalValue !== undefined) ? externalValue : 42
          const value = (externalValue !== null && externalValue !== undefined) ? externalValue : 42

        
        
          
        
      

Оператор ?? возвращает первый операнд (externalValue), если он не null и не undefined, иначе — второй (42). Теперь через externalValue можно передать '', NaN, 0 , -0, 0n, false, в отличие от кейса с ||.

Сравните результат операций с || и ??:

externalValue externalValue || 42 externalValue ?? 42
1 1 1
'hi' 'hi' 'hi'
null 42 42
undefined 42 42
0 42 0
'' 42 ''
false 42 false