Почему if нельзя напрямую присвоить константе?

Структура if

if (условие) {
  инструкция1;
} else {
  инструкция2;
}

Структура тернарного оператора

условие ? выражениеЕслиTrue : выражениеЕслиFalse

Структура функции

function имя (параметр) {
  инструкция;
}

И if, и тернарный оператор — условные операторы, но во втором случае есть возможность присвоения константе напрямую.

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

Но внутри функции также находятся инструкции и при этом, используя оператор return, мы можем вернуть значение и присвоить его константе.

Почему же мы не можем, используя return внутри if, присвоить значение константе?


Ответы (2 шт):

Автор решения: vsemozhebuty

К сожалению, таков синтаксис языка — expressions возвращают значения (в том числе вызов функции), statements (в том числе объединённые в блок) не возвращают значения, поэтому их результат нельзя присвоить.

Но скоро вы сможете делать что-то похожее, если это предложение войдёт в стандарт:

https://github.com/tc39/proposal-do-expressions

→ Ссылка
Автор решения: OPTIMUS PRIME

return можно использовать только внутри функций, а if - не функция)

Честно: Не могу придумать реальный пример (кроме как "захотелось"), когда такой синтаксис был бы правда необходим. Более того, если и внутри if, и внутри else что-то очень длинное и сложное, вероятно, стоит завернуть каждый исход в отдельную функцию.

Варианты решения «Проблемы»:

let x = 15;

const y = (x > 0) ? f(x) : g(x);

console.log(y);

/***/
function f(x) { // Что-то сложное и многострочное;
  return x * x + 10;
}

function g(x) { // Что-то сложное и многострочное;
  return x * x * x;
}

let x = 15;

const y = handler(x);

console.log(y);

/***/
function handler(x) {
  if(x > 0) {
    // что-то из нескольких строчек
    return x * x + 10;
  }
  
  // Если верхний return сработал, дело уже не дойдет сюда. Можно без else.
  return x * x * x;
}

→ Ссылка