2013-07-28 19 views
5

Czy jest jakaś różnica między poniższymi dwoma fragmentami lub z jakiegokolwiek innego powodu, aby używać jednego nad drugim?Różnica między "if (foo) bar();" i "foo && bar();"

if (foo) { 
    bar(); 
} 

 

foo && bar(); 
+0

Pierwszy jest bardziej tradycyjny. W rzeczywistości są jednak tacy sami. –

+0

Bez różnicy, ale wolę jedną linię instrukcji "if". 'if (foo) bar();' – elclanrs

Odpowiedz

12

Drugi sposób jest znany jako short-circuit evaluation i powoduje takie same jak w pierwszej postaci. Jednak pierwsza forma jest bardziej czytelna i powinna być preferowana ze względu na łatwość konserwacji.

Ten rodzaj oceny krótkiego spływu jest często widziany w instrukcjach if, gdzie prawica jest oceniana warunkowo. Zobacz przykład poniżej; pasek jest oceniany tylko wtedy, gdy foo jest prawdziwe.

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

+1 Świetna odpowiedź. – Matt

+0

To nie jest dokładnie to samo, w sensie gramatyki. (* expression * vs * statement *) – user123444555621

3

Wersja foo && bar() jest wyrazem, a zatem ma wartość:

var result = foo && bar(); 

Podczas korzystania z wersji if, powyższe może wyglądać następująco:

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

który jest bardziej gadatliwy.

+1

W rzeczywistości 'foo && bar();' jest instrukcją, a nie wyrażeniem, 'foo && bar()' jest wyrażeniem. – zch

+0

@zch Prawidłowe. Jest to [wyrażenie wypowiedzi] (http://es5.github.io/#x12.4). – user123444555621

+0

wersja-if nie jest poprawna; jeśli foo jest falsy, zwracana jest wartość falsy. Zatem 'else {result = foo; } '. – bouke

1

Odpowiedź bouke z oceną short-cuircuit jest naprawdę dobra. Ale lubię dodać, że dobrym stylem kodowania jest użycie instrukcji if, jeśli wywołanie bar() nie ma wartości zwracanej przez boolean i żaden kolejny warunek nie musi być spełniony za pomocą bar().

Powiązane problemy