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

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

Время чтения: 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 = 5if (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() выполнился последним