Оператор ветвления if...else

Условные операторы позволяют в зависимости от значения логического выражения выполнить отдельный участок программы или, наоборот, не выполнять его. Логические выражения возвращают только два значения: true (истина) или false (ложь).

Оператор ветвления if...else имеет следующий формат:

if (<Логическое выражение>) {
   <Блок, выполняемый, если условие истинно>
}
[else {
   <Блок, выполняемый, если условие ложно>
}]

Если логическое выражение возвращает значение true, то выполняются инструкции, расположенные внутри фигурных скобок, сразу после оператора if. Если логическое выражение возвращает значение false, то выполняются инструкции после ключевого слова else. Блок else является необязательным. Допускается не указывать фигурные скобки, если блоки состоят из одной инструкции. В качестве примера проверим число, введенное пользователем в командной строке, на четность и выведем соответствующее сообщение (листинг 4.2).

Листинг 4.2. Проверка числа на четность

const process = require('process');

// Проверяем передачу числа в командной строке
if (process.argv.length == 3) {
   let x = parseInt(process.argv[2], 10);
   if ( isNaN(x) ) {
      console.log('Вы ввели не число!');
   }
   else {
      if ( (x % 2) == 0 ) {
         console.log('Четное число');
      }
      else {
         console.log('Нечетное число');
      }
   }
}
else {
   // Если число не передано
   console.log('Передайте число в конце команды');
}

Итак, первое условие проверяет наличие числа в составе команды. Если количество элементов массива process.argv не равно трем, то выполняется последний блок else, внутри которого выводится подсказка пользователю:

C:\book\p1>node index.js
Передайте число в конце команды

Вы же помните, что первый элемент массива process.argv содержит путь к программе node.exe, а второй — путь к исполняемому файлу? Следовательно, при передаче числа, массив должен состоять минимум из трех элементов. В данном примере мы проверяем равенство значению 3, хотя можем воспользоваться условием:

if (process.argv.length > 2) {

или:

if (process.argv.length >= 3) {

Но все эти условия допускают количество параметров больше трех, а мы ожидаем только одно число. Поэтому ограничиваем сравнение равенством значению 3.

Затем получаем элемент с индексом 2 из массива process.argv. Вы же еще помните, что нумерация элементов массива начинается с 0, а не с 1? Не забывайте! Поэтому третий элемент массива имеет индекс 2. Вы еще помните, что получаемое значение имеет тип string (строка)? Не забывайте! Поэтому мы сразу выполняем преобразование строки в число с помощью функции parseInt(). Мы ожидаем десятичное значение, поэтому во втором параметре указываем основание 10.

Вместо числа пользователь может ввести все, что угодно. Поэтому, прежде чем проверять число на четность, нужно убедиться, что преобразование типов выполнено успешно. Если преобразовать строку в число невозможно, то функция parseInt() вернет значение NaN (нет числа). Велик соблазн сравнить значение переменной x со значением NaN, но тут мы столкнемся с проблемой. Значение NaN не равно даже самому себе:

let y = NaN;
console.log( NaN == NaN );             // false
console.log( NaN === NaN );            // false
console.log( y === NaN );              // false

Чтобы проверить равенству значению NaN, следует использовать функцию isNaN(), которая возвращает true, если значение, указанное в качестве параметра, равно NaN, и false в противном случае:

let a = NaN, b = 5;
console.log( isNaN(a) === true );      // true
console.log( isNaN(b) === true );      // false

Проверка на равенство выражения значению true (истина) выполняется по умолчанию, поэтому можно просто написать так:

let a = NaN, b = 5;
console.log( isNaN(a) );               // true
console.log( isNaN(b) );               // false

Именно так мы и сделали в листинге 4.2. Если пользователь ввел не число, то выводим соответствующее сообщение, а блок else при этом пропускается:

C:\book\p1>node index.js str
Вы ввели не число!

Если пользователь ввел число, то управление передается блоку else, внутри которого мы опять проверяем условие. Если деление по модулю (оператор %) на 2 выполняется без остатка, т. е. значение равно нулю, то число является четным:

C:\book\p1>node index.js 10
Четное число

В противном случае число является нечетным и выполняется блок else:

C:\book\p1>node index.js 11
Нечетное число

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

  • если число равно 0 или 0.0:
console.log( !!0 );         // false
console.log( !!0.0 );       // false
  • если указана пустая строка:
console.log( !!"" );        // false
  • если переменная содержит значение null:
console.log( !!null );      // false
  • если переменная содержит значение NaN:
console.log( !!NaN );       // false
  • если свойство объекта не существует или переменной не присвоено начальное значение:
let obj = {}, x;
console.log( !!obj.attr );  // false
console.log( !!x );         // false
console.log( !!undefined ); // false

Все остальные значения будут преобразованы в true:

console.log( !!10 );               // true
console.log( !!"0" );              // true
let obj1 = { }, obj2 = { n: 20 };
console.log( !!obj1 );             // true
console.log( !!obj2.n );           // true

Как видно из листинга 4.2, один условный оператор можно вложить в другой. Кроме того, если блок состоит из одной инструкции, фигурные скобки можно не указывать:

if ( (x % 2) == 0 ) console.log('Четное число');
else console.log('Нечетное число');

Более того, блока else может не быть совсем:

if ( (x % 2) == 0 ) console.log('Четное число');

Инструкции в условном операторе можно записать так:

let x = 10;
if ( (x % 2) == 0 )
   console.log('Четное число');
else
   console.log('Нечетное число');
console.log('x = ' + x);

Если фигурные скобки не указаны, то считается, что внутри блока содержится только одна инструкция. Поэтому последняя инструкция к блоку else не относится. Она будет выполнена в любом случае, вне зависимости от условия. Чтобы это сделать наглядным, перед инструкциями, расположенными внутри блока, добавлено одинаковое количество пробелов. Если записать следующим образом, то ничего не изменится:

let x = 10;
if ( (x % 2) == 0 )
console.log('Четное число');
else
console.log('Нечетное число');
console.log('x = ' + x);

Однако в дальнейшем разбираться в таком коде будет неудобно. Поэтому перед инструкциями внутри блока всегда следует размещать одинаковый отступ. В качестве отступа можно использовать пробелы или символ табуляции. При использовании пробелов размер отступа равняется трем или четырем пробелам для блока первого уровня. Для вложенных блоков количество пробелов умножают на уровень вложенности: если для блока первого уровня вложенности использовалось три пробела, то для блока второго уровня вложенности должно использоваться шесть пробелов, для третьего уровня — девять пробелов и т. д. В одной программе не следует использовать и пробелы и табуляцию в качестве отступа. Необходимо выбрать что-то одно и пользоваться этим во всей программе.

При отсутствии пробелов или фигурных скобок чтение программы может вызывать затруднения. Даже если знаешь приоритет выполнения операторов, всегда закрадывается сомнение, и чтение программы останавливается. Например, к какому оператору if принадлежит блок else в этом примере?

if (x >= 0) if (x == 0) y = 0; else y = 1;

Задумались? А зачем задумываться об этом, если можно сразу расставить фигурные скобки? Ведь тогда никаких сомнений вообще не будет:

if (x >= 0) { if (x == 0) y = 0; else y = 1; }

А если сделать так, то чтение и понимание программы станет мгновенным:

if (x >= 0) {
   if (x == 0) y = 0;
   else y = 1;
}

Если блок состоит из нескольких инструкций, то следует указать фигурные скобки. Существует несколько стилей размещения скобок в операторе if:

// Стиль 1
if (<Логическое выражение>) {
   // Инструкции
}
else {
   // Инструкции
}
// Стиль 2
if (<Логическое выражение>) {
   // Инструкции
} else {
   // Инструкции
}
// Стиль 3
if (<Логическое выражение>)
{
   // Инструкции
}
else
{
   // Инструкции
}

Многие программисты считают Стиль 3 наиболее приемлемым, так как открывающая и закрывающая скобки расположены друг под другом. На наш же взгляд образуются лишние пустые строки. Так как размеры экрана ограничены, при наличии пустой строки на экран помещается меньше кода и приходится чаще пользоваться полосой прокрутки. Если размещать инструкции с равным отступом, то блок кода выделяется визуально и следить за положением фигурных скобок просто излишне. Тем более, что редактор VS Code позволяет подсветить парные скобки. Какой стиль использовать, зависит от личного предпочтения программиста или от правил оформления кода, принятых в определенной фирме. Главное, чтобы стиль оформления внутри одной программы был одинаковым. В этой книге мы будем пользоваться Стилем 1.

Для проверки нескольких условий часто используется следующий синтаксис:

if (<Условие 1>) {
   // <Блок 1>
}
else if (<Условие 2>) {
   // <Блок 2>
}
// ... Фрагмент опущен ...
else if (<Условие N>) {
   // <Блок N>
}
else {
   // <Блок else>
}

Если <Условие 1> истинно, то выполняется <Блок 1>, а и все остальные условия пропускаются. Если <Условие 1> ложно, то проверяется <Условие 2>. Если <Условие 2> истинно, то выполняется <Блок 2>, а все остальные условия пропускаются. Если <Условие 2> ложно, то точно также проверяются остальные условия. Если все условия ложны, то выполняется <Блок else>. В качестве примера определим какое число от 0 до 2 ввел пользователь (листинг 4.3).

Листинг 4.3. Проверка нескольких условий

const process = require('process');

// Проверяем передачу числа в командной строке
if (process.argv.length == 3) {
   let x = parseInt(process.argv[2], 10);
   if ( isNaN(x) ) {
      console.log('Вы ввели не число!');
   }
   else {
      if (x == 0)
         console.log("Вы ввели число 0");
      else if (x == 1)
         console.log('Вы ввели число 1');
      else if (x == 2)
         console.log('Вы ввели число 2');
      else {
         console.log('Вы ввели другое число');
         console.log(`x = ${x}`);
      }
   }
}
else {
   // Если число не передано
   console.log('Передайте число от 0 до 2 в конце команды');
}

Запустим программу на выполнение в командной строке, передав разные значения:

C:\book\p1>node index.js
Передайте число от 0 до 2 в конце команды

C:\book\p1>node index.js str
Вы ввели не число!

C:\book\p1>node index.js 1
Вы ввели число 1

C:\book\p1>node index.js 88
Вы ввели другое число
x = 88

Для быстрой вставки оператора if...else в редакторе VS Code, предназначены следующие комбинации:

if =>
if (condition) {
   
}

ifelse<Tab> =>
if (condition) {
   
} else {
   
}

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов