2013-07-28 4 views
5

Есть ли разница между следующими двумя фрагментами или любой причиной использования одного над другим?Разница между «if (foo) bar();» и "foo && bar();"

if (foo) { 
    bar(); 
} 

 

foo && bar(); 
+0

1-й более традиционный. Фактически, они все те же. –

+0

Никакой разницы, но я предпочитаю однострочное выражение 'if'. 'if (foo) bar();' – elclanrs

ответ

12

Вторая форма известна как short-circuit evaluation и результаты точно так же, как и в первой форме. Однако первая форма более читаема и должна быть предпочтительной для ремонтопригодности.

Этот тип оценки коротких замыканий часто встречается в if-утверждениях, где правая рука условно оценивается. См. Пример ниже; bar оценивается только в том случае, если foo имеет значение true.

if (foo && bar()) { 
    // ... 
} 
+0

+1 Отличный ответ. – Matt

+0

Это не совсем то же самое, в смысле грамматики. (* выражение * vs * statement *) – user123444555621

3

версия foo && bar() является выражением, и, таким образом, имеет значение:

var result = foo && bar(); 

При использовании версии if, выше может выглядеть следующим образом:

var result; 
if (foo) { 
    result = bar(); 
} 

который больше подробный.

+1

Фактически 'foo && bar();' это выражение, а не выражение, 'foo && bar()' - выражение. – zch

+0

@zch Правильно. Это выражение [выражение] (http://es5.github.io/#x12.4). – user123444555621

+0

неверная версия if; если foo является ложным, возвращается значение фальшивости. Таким образом, 'else {result = foo; } '. – bouke

1

Ответ на вопросник с оценкой коротких замыканий действительно хорош. Но мне нравится добавить, что хорошим стилем кодирования является использование if-statement, если вызов bar() не имеет значения boolean-return-value, и никакое дополнительное условие не должно выполняться с помощью bar().

Смежные вопросы