Разница между if (x) {foo(); } и x? foo(): 0;

Фрагмент 1:

if ( x ) { 
    foo();
}

Фрагмент 2:

x ? foo() : 0;  

Каковы различия между этими двумя фрагментами?

Изменить: Исправлена ​​ошибка синтаксиса.

Обновить: btw, кажется, что есть еще более короткое обозначение:

x && foo();

Ответы

Ответ 1

Как правило, if представляет собой инструкцию (например, вы не можете назначить ее переменной), а тернарный оператор ?: является частью выражения (дает значение, которое может быть присвоено переменным).

Кроме того, блок if может содержать инструкции, а компоненты ?: могут содержать только выражения.

В примере, который вы даете, нет никакой разницы, так как вы не используете результат ?:. Оба фрагмента оценивают foo() только в том случае, если x является истинным значением.

Ответ 2

Snippet # 2 является недействительным выражением ECMAScript, так как ему не хватает требуемого : blah, чтобы сделать его тройным.

РЕДАКТИРОВАТЬ: На самом деле нет разницы между двумя фрагментами, они оба вызывают foo, если x прав. Если x является ложным (undefined/false/empty string/0/), то первый фрагмент не будет оценивать что-либо, последний фрагмент будет оцениваться до 0, но этот 0 действительно не влияет на script.

Ответ 3

Я думаю, вы хотели спросить следующее

// Why should I use
if (x) {
  do();
}

// instead of 
x && do();

или

// Why should I use
if (x) {
  do(); 
} else {
  dont();
}

//instead of 
x ? do() : dont()

Как они написаны, нет никакой разницы в выходе. Мне не нравится использовать тернарный или && оператора в этих случаях из-за семантики использования тройной и &. Терминал возвращает значение, которое вы не используете, также как && выражение. Поэтому я предпочел бы использовать способ использования операторами.

Однако мне нравится использовать && для нулевых проверок

var val = obj && obj.getValue();

Обратите внимание, что в этом случае мы используем возвращаемое значение выражения