2013-07-28 11 views
5

C'è qualche differenza tra i seguenti due snippet o un motivo per utilizzarne uno sull'altro?Differenza tra "if (foo) bar();" e "foo && bar();"

if (foo) { 
    bar(); 
} 

 

foo && bar(); 
+0

Il primo è più tradizionale. In effetti, sono uguali, però. –

+0

Nessuna differenza ma preferisco una frase 'if'. 'if (foo) bar();' – elclanrs

risposta

12

La seconda forma è noto come short-circuit evaluation e comporta esattamente come la prima forma. Tuttavia, la prima forma è più leggibile e dovrebbe essere preferita per la manutenibilità.

Questo tipo di valutazione di cortocircuito si vede spesso nelle dichiarazioni if, dove la mano destra viene valutata condizionatamente. Vedere l'esempio di seguito; bar viene valutato solo se foo viene valutato come true.

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

+1 Ottima risposta. – Matt

+0

Non è esattamente lo stesso, nel senso della grammatica. (* espressione * vs * istruzione *) – user123444555621

3

La versione foo && bar() è un'espressione, e quindi ha un valore:

var result = foo && bar(); 

Quando si utilizza la versione if, quanto sopra potrebbe essere simile a questo:

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

che è più verbose.

+1

In realtà 'foo && bar();' è un'istruzione, non un'espressione, 'foo && bar()' è un'espressione. – zch

+0

@zch corretto. È una [dichiarazione di espressione] (http://es5.github.io/#x12.4). – user123444555621

+0

l'if-versione non è corretta; se foo è falsy, viene restituito quel valore di falsy. Quindi 'else {result = foo; } '. – bouke

1

La risposta del bouke con la valutazione del cortocircuito è veramente buona. Ma mi piace aggiungere che un buon stile di codifica è l'uso dell'istruzione if, se il richiamo di bar() non ha valore di ritorno booleano e non deve essere soddisfatta nessuna ulteriore condizione usando bar().

Problemi correlati