Разница между 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();
Обратите внимание, что в этом случае мы используем возвращаемое значение выражения