Istruzione 'if' a riga singola JavaScript: sintassi migliore, questa alternativa?


201

È stato chiaramente affermato, nonostante l'opinione, che rinunciare alle parentesi graffe su una singola riga ifnon sia l'ideale per la manutenibilità e la leggibilità.

Ma che dire di questo?

if (lemons) { document.write("foo gave me a bar"); }

È ancora più compresso e, se espanso, le parentesi graffe non saranno dimenticate. Ci sono problemi palesi e, in caso contrario, quali sono le considerazioni? Sento che è ancora molto leggibile, almeno quanto un operatore ternario comunque. Mi sembra che gli operatori ternari non siano suggeriti tanto a causa della leggibilità, sebbene ritenga che tale conclusione non sia altrettanto unanime.

Il gemello malvagio in me vuole suggerire questo, anche se la sintassi ovviamente non è pensata per questo, ed è probabilmente solo una cattiva idea.

(syntax) ? document.write("My evil twin emerges"): "";

2
Sarebbe bello se JavaScript supportasse i condizionali di fine frase:document.write("My evil twin emerges") if lemons
Beau Smith,

7
Penso che potresti pensare alla breve frase if, else. ( variable = (condition) ? true-value : false-value;.) Buona fortuna.
Progo,

Risposte:


328

Ho visto il comportamento di corto circuito &&dell'operatore utilizzato per raggiungere questo obiettivo, anche se le persone che non sono abituate a questo possono trovare difficile da leggere o addirittura chiamarlo un anti-schema:

lemons && document.write("foo gave me a bar");  

Personalmente, userò spesso una riga singola ifsenza parentesi, in questo modo:

if (lemons) document.write("foo gave me a bar");

Se devo aggiungere più istruzioni, inserirò le istruzioni nella riga successiva e aggiungerò parentesi. Poiché il mio IDE esegue il rientro automatico, le obiezioni di manutenibilità a questa pratica sono controverse.


11
Mi piace il secondo. Grazie per l'input e un'altra alternativa creativa sul primo!
David Hobs,

dovresti sapere cosa ti aspetti, dal momento che stringa vuota e 0 sono valori falsi, fallirà l'esecuzione della seconda istruzione
Orlando

1
Ovviamente, puoi anche inserire una dichiarazione booleana più esplicita lì
acjay

7
@PeterOlson perché vengono contestate le obiezioni di manutenibilità? Che cosa succede se qualsiasi altro sviluppatore capita di non utilizzare il tuo IDE con la sua configurazione.
agconti,

2
Grazie per essere abbastanza coraggioso da parlare a sostegno di una sola riga se dichiarazioni senza parentesi. Un giorno i nostri figli ti ringrazieranno.
Marc M.

136

Lo uso così:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");

36
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji,

43

Puoi usare questo formato, che è comunemente usato in PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

12
Non hai bisogno di parentesi sul lemon.
leymannx,

6
Può essere la migliore pratica includere () attorno a un'istruzione condizionale - rimuove qualsiasi confusione sull'ordine delle operazioni ecc. Per altri sviluppatori. In genere vado in errore a specificarlo, tranne quando non c'è modo che qualcuno decentemente qualificato si confonda.
djvs,

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh,

Mi piacciono le parentesi quanto a me implicano una coercizione booleana.
Daniel Sokolowski l'

18

Questa linea è molto più pulita.

if(dog) alert('bark bark');

Preferisco questo. spero che aiuti qualcuno


16

può usare questo,

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

spiegazione: se lemonsesiste allora dammi unalert("please give me a lemonade") else alert("then give me a beer")


Ottima soluzione
Davidson Lima,

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib

15

// Un altro semplice esempio

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
perché non semplicemente .. var a = 11; alert(a === 10);?
ManuKaracho,

@ManuKaracho Vedo molto questo problema quando lavoro con dichiarazioni ternarie. Capisco che OP potrebbe aver appena provato a scriverne uno semplice ma è dilagante nel codice che ho letto al lavoro.
Adam-Beck,

alert(a === 10 ? "true" : "false")
Josh Wood,

@JoshWood anche l'avviso stampa booleani, quindi puoi fare alert(a===10)come ha detto Manu.
Keith,

12

Come molte persone hanno detto, se stai cercando una linea reale se allora:

    if (Boolean_expression) do.something();

è preferito. Tuttavia, se stai cercando di fare un if / else, ternary è il tuo amico (e anche super cool):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

ANCHE:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Tuttavia, ho visto un esempio molto interessante. Urla a @ Peter-Oslson per &&

    (Boolean_expression) && do.something();

Infine, non è un'istruzione if, ma anche l'esecuzione di cose in un ciclo con una mappa / riduci o Promise.resolve () è divertente. Urla a @brunettdan


7

Come è già stato affermato, è possibile utilizzare:

&& stile

lemons && document.write("foo gave me a bar");  

o

stile senza parentesi

if (lemons) document.write("foo gave me a bar");

ritorno di corto circuito

Se, tuttavia, si desidera utilizzare l' ifistruzione a una riga per cortocircuitare una funzione, è necessario utilizzare la versione senza parentesi in questo modo:

if (lemons) return "foo gave me a bar";

come

lemons && return "foo gave me a bar"; // does not work!

ti darà un SyntaxError: Unexpected keyword 'return'


Nei cortocircuiti a linea singola, possiamo omettere il "ritorno" e dovrebbe funzionare come previsto. `` limoni && "foo mi ha dato un bar"; // lavori! ``
siwalikm

@siwalikm potresti spiegarmi? Questo è per il caso in cui non vuoi tornare lemons(se è falso) - vuoi solo tornare "foo mi ha dato la barra" quando lemonsè vero.
Marc,

if (limoni) restituisce "foo mi ha dato un bar"; questo è sbagliato. Ti darà "Uncaught SyntaxError: Dichiarazione di ritorno illegale"
Fenec

@Fenec condivideresti il ​​browser e la versione che causa questo errore? Questo ha funzionato per me quasi 2 anni fa e continua a funzionare per me.
Marc

4

Ho visto molte risposte con molti voti a favore dell'operatore ternario. Il ternario è ottimo se a) hai un'opzione alternativa eb) stai restituendo un valore abbastanza semplice da una condizione semplice. Ma...

La domanda originale non aveva un'alternativa e l'operatore ternario con un solo ramo (reale) ti costringe a restituire una risposta confusa.

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Penso che la variazione più comune sia lemons ? 'foo...' : '' , e, come saprai leggendo la miriade di articoli per qualsiasi lingua su vero, falso, verità, falsità, null, zero, vuoto, vuoto (con il nostro senza?), Stai entrando un campo minato (anche se un campo minato ben documentato).

Non appena una parte del ternario diventa complicata, si sta meglio con una forma più esplicita di condizionale.

Una lunga strada per dire che sto votando if (lemons) "foo".


2

Può anche essere fatto usando una sola riga con whileloop e in ifquesto modo:

if (blah)
    doThis();

Funziona anche con i whileloop.


7
Ciò non guasterà e non è raccomandato
danwellman

9
L'OP ha anche chiesto un one-liner.
codifica in aaron il

2

Esempio nelle funzioni freccia:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

Nelle promesse:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

Altrimenti:

if(somethingTrue) thenDo()

Se è solo un semplice condizionale, preferisco usare if (value) ogni volta che è possibile perché la parola if all'inizio dell'affermazione dice di più su cosa sta succedendo rispetto a parantesi e punti interrogativi.


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Anche assegnando l'operazione possiamo fare anche con parentesi tonde

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

"Anche assegnando l'operazione possiamo fare anche con parentesi tonde". Questo è molto interessante, non sapevo che fosse possibile assegnare operazioni all'interno di queste operazioni a linea singola.
sagits
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.