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();
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();
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()) {
// ...
}
+1 Ottima risposta. – Matt
Non è esattamente lo stesso, nel senso della grammatica. (* espressione * vs * istruzione *) – user123444555621
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.
In realtà 'foo && bar();' è un'istruzione, non un'espressione, 'foo && bar()' è un'espressione. – zch
@zch corretto. È una [dichiarazione di espressione] (http://es5.github.io/#x12.4). – user123444555621
l'if-versione non è corretta; se foo è falsy, viene restituito quel valore di falsy. Quindi 'else {result = foo; } '. – bouke
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().
Il primo è più tradizionale. In effetti, sono uguali, però. –
Nessuna differenza ma preferisco una frase 'if'. 'if (foo) bar();' – elclanrs