Выражения и инструкции

Делим весь код на две группы — одна возвращает значения, другая — нет.

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

Кратко

Секция статьи "Кратко"

Выражение (англ. expression) — это код, который после выполнения возвращает какое-либо значение. Например, 5 + 3 вернёт 8, а Math.random() — случайное число.

Инструкция (англ. statement) — это отдельная команда в коде, которая выполняет определённое действие. Например, if позволяет создать ветвление в программе, for позволяет повторять одно и то же действие.

Как понять

Секция статьи "Как понять"

Выражения

Секция статьи "Выражения"

Любая программа — это набор операций. Чтобы описать программу, разработчик пишет различные выражения на языке программирования. Посмотрим на самое простое выражение — откроем консоль любого браузера и введём туда элементарное выражение — число.

        
          
          123
          123

        
        
          
        
      

Когда мы нажмём Enter, консоль ответит нам тем же самым числом. Поздравляю, это было самое простое выражение. Интерпретатор JavaScript выполнил его и вернул результат последней (в данном случае единственной) операции.

Первое выражение

Усложним пример и добавим немного действий. Введём в консоль браузера классическую математическую задачку на внимательность:

        
          
          2 + 2 * 2
          2 + 2 * 2

        
        
          
        
      

JavaScript разбирается в математике, и потому в результате выполнения такого выражения мы получим число 6. Как JavaScript считал?

2 + 2 * 2 – составное выражение. В нем есть как выражения, представляющие числа, так и выражения, представляющие операции с числами. Таких выражений можно быть много, с их помощью мы комбинируем и трансформируем значения.

Составные выражения лучше понимать в виде схемы:

Схема выражения 2 + 2 * 2

Операциям сложения и умножения нужны два выражения – левое и правое, чтобы вычислить результат. В левой части сложения будет число 2, а в правой — составное выражение 2 * 2, которое будет аналогично разбираться по частям.

Рассмотрим пример чуть сложнее. Введём в консоль:

        
          
          (1 + 3) * (4 - 2)
          (1 + 3) * (4 - 2)

        
        
          
        
      

Схематично выражение можно представить так:

Схема выражения (1 + 3) * (4 - 2)

Как и в предыдущем примере, можно проследить из каких частей состоит выражение и как эти части связаны. В итоге мы получим ответ 8.

Из всех перечисленных примеров можно сделать вывод, что выражения оперируют с данными — это могут быть не только числа, но и строки, и сложные структуры данных. Данные сочетаются с операциями над ними (например, сложение, вычитание, умножение), и программа выдаёт результат выражения. Удобно представлять выражение как наборы данных в сочетании с операциями, которые их обрабатывают. Схематично программу, состоящую из выражений, можно изобразить как последовательность блоков.

Схема последовательных выражений

Инструкция

Секция статьи "Инструкция"

Работа с данными — это ещё не все, что нужно для создания программы. Выражения не решают много вопросов: Как описать с помощью выражения действие по определённому условию? Да, у нас будут данные и можно написать выражение, чтобы вычислить условие, но как сказать программе делать то или иное действие? А если какое-то действие нужно повторить несколько раз?

Для этого в языках программирования существуют инструкции. Они не являются выражениями, но позволяют правильно настроить порядок их выполнения.

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

        
          
          const someNumber = getSomeRandomNumber()if (someNumber > 10) {  console.log('Больше десяти')} else {  console.log('Меньше десяти')}
          const someNumber = getSomeRandomNumber()

if (someNumber > 10) {
  console.log('Больше десяти')
} else {
  console.log('Меньше десяти')
}

        
        
          
        
      

Инструкции ничего не вычисляют и не возвращают результат, поэтому они не являются выражениями. Например, инструкция if позволяет описать несколько путей выполнения программы. Её условие будет вычислено с помощью выражения (num > 10 является выражением и возвращает булевый результат, а внутри условных веток так же будут присутствовать другие выражения (вызов функции – это выражение и оно возвращает результат).

Таким образом, объединяя всего одну инструкцию с выражениями мы получаем программу с ветвлением:

Схема ветвления

А используя инструкцию for или while можно зациклить какое-то действие:

        
          
          let sum = 0// В этой строчке инструкцией является for и объявление переменной, а все остальное — выраженияfor (let i = 1; i < 10; i++) {  // Прибавляем значение, это является выражением  sum = sum + 1}
          let sum = 0

// В этой строчке инструкцией является for и объявление переменной, а все остальное — выражения
for (let i = 1; i < 10; i++) {
  // Прибавляем значение, это является выражением
  sum = sum + 1
}

        
        
          
        
      

И точно так же, объединяя инструкцию с другими выражениями мы получаем более осмысленную программу.

Схема цикла

В JavaScript все инструкции можно поделить на несколько категорий:

  • управление потоком выполнения (if и else, switch, throw и так далее);
  • итерации (for, while и так далее);
  • объявление значений (var, let, const);
  • функции (function, return и так далее);
  • прочие (debugger, import, export).

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

Выражения + Инструкции = ❤️

Как писать

Секция статьи "Как писать"

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

        
          
          getBioAbout(  if (num > 10) { return 'Шерлок' }  else { return 'Ватсон' }) // Выведет ошибку: SyntaxError: Unexpected token 'if
          getBioAbout(
  if (num > 10) { return 'Шерлок' }
  else { return 'Ватсон' }
) // Выведет ошибку: SyntaxError: Unexpected token 'if

        
        
          
        
      

Такой пример не будет работать. В качестве аргумента при вызове можно передавать простое выражение (например, конкретную строку 'Илон Маск' или число 5), либо составное выражение, которое вычислит и вернёт значение (например, вызов другой функции getCurrentUser()). Но передавать инструкцию в функцию нельзя.

        
          
          // Передаём составное выражение, которое вычислит и вернёт строкуgetBioAbout('Илон Маск')getBioAbout('Шерлок' + ' ' + 'Холмс')getBioAbout(getCurrentUser())
          // Передаём составное выражение, которое вычислит и вернёт строку
getBioAbout('Илон Маск')
getBioAbout('Шерлок' + ' ' + 'Холмс')
getBioAbout(getCurrentUser())

        
        
          
        
      

🛠 Последовательные инструкции можно разделять оператором точка с запятой ;.

        
          
          // Разделяем последовательные инструкцииconst num = 5;if (5 < 10) {};if (5 > 10) {};
          // Разделяем последовательные инструкции
const num = 5;

if (5 < 10) {};
if (5 > 10) {};

        
        
          
        
      

А вот выражения можно разделять через оператор запятая ,. В этом случае все выражения выполнятся по порядку слева направо, но результат вернётся только от последнего в цепочке. Оператор запятая почти не используется, т.к его использование часто усложняет код.

        
          
          function x() {  return 1}function z() {  return 2}x(), z() // вернётся значение 2, потому что z() выполнился последним
          function x() {
  return 1
}
function z() {
  return 2
}

x(), z() // вернётся значение 2, потому что z() выполнился последним