2009-05-15 13 views
18

È corretto utilizzare operatori condizionali come un'istruzione come questa?Operatori condizionali in Javascript

(x == y) ? alert("yo!") : alert("meh!"); 

O è più corretto utilizzarlo per assegnare un valore come tale?

z = (x == y) ? "yo!" : "meh!"; 

Se non è corretto usarlo come una dichiarazione, allora è possibile aggiungere più di una riga di codice per l'esecuzione in questo modo? È più corretto utilizzare ifthen e switch statement per più righe di codice?

(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!")); 
+0

La sintassi esiste per una ragione: va bene. – Cerebrus

+0

ne so abbastanza per sapere che esiste un modo efficace o più appropriato per fare le cose. semplicemente non so cosa sono la maggior parte del tempo! grazie, a tutti, per rintoccare! quindi gli operatori condizionali e le dichiarazioni multiple possono, ma probabilmente non dovrebbero mescolarsi. fatto. – baokhangluu

risposta

25

operatori condizionali sono volutamente sintetica e particolarmente utile per le assegnazioni:

var a = x ? 1 : 2; 

li utilizzano per le funzioni di correre in modo condizionale, mentre è possibile, dovrebbe, per il bene di leggibilità essere fatto utilizzando if/else:

// This is possible but IMO not best practice: 
X ? doSomething() : doSomethingElse(); 

Mentre prolisso, la maggior parte del tempo, questa è la soluzione migliore:

if (X) { 
    doSomething(); 
} else { 
    doSomethingElse(); 
} 

Un notevole vantaggio della struttura IF/ELSE è che è possibile aggiungere ulteriori attività in ogni condizione con problemi minimi.

tuo ultimo frammento è anche possibile, ma sembra un po 'prolisso e, ancora una volta, potrebbe essere più adatto a una struttura logica più convenzionale; come un blocco IF/ELSE.

Detto questo, un operatore condizionale può ancora essere leggibile, ad es.

(something && somethingElse > 2) ? 
    doSomeLongFunctionName() 
    : doSomeOtherLongFunctionName(); 

Alla fine, come molte cose, si è scesi a preferenze personali. Ricorda sempre che il codice che stai scrivendo non è solo per te; altri sviluppatori potrebbero doverlo guadare in futuro; cerca di renderlo il più leggibile possibile.

2

Uno dei due metodi sono accettabili, anche se si potrebbe avere anche scritto:

alert((x == y) ? "yo!" : "meh!"); 

A parte che non avrei mai consiglia di utilizzare una linea condizionale per dichiarazioni su più righe, basta usare uno standard if/else bloccare. Data la sintassi che hai inserito non è valido nemmeno JS, avresti potuto inserire le istruzioni multiple in metodi anonimi e yada yada, dopodiché entri in un pasticcio intricato di codice quasi ingovernabile e inutilmente difficile. Quindi, di nuovo, standard se/else.

+0

grazie! non stavo pensando a come ottimizzarlo, ma è grandioso. Devo ancora lasciarlo affondare in modo che possano essere usati nelle espressioni WITHIN. – baokhangluu

4

JavaScript non ti impedirà di farlo, ma è molto una pratica insolita che confonderà chiunque legga il codice.

L'operatore condizionale è quasi sempre utilizzato per la selezione di due valori possibili, non dichiarazioni. Un'istruzione if è preferibile per la ramificazione condizionale delle istruzioni.

Quanto alla tua ultima domanda, sì, se proprio deve, si può abusare del [] costrutto:

(x == y) ? [alert("yo!"), document.write("woot!")] : otherstuff(); 

Ma per favore non lo fanno. 8-)

4

Spetta interamente a te, puoi farlo in entrambi i modi. Devi solo chiederti, però, questo stile segue le linee guida aziendali e quanto leggibile vuoi che questo codice sia?

Utilizzo di istruzioni if ​​è molto più leggibile.

Personalmente, io uso solo l'operatore ternario per semplici e veloci falsi condizioni/veri - in cui così facendo ha un senso - o dove ho bisogno di qualcosa "in linea".

2

Sono d'accordo sia con Chris e J-P che:

  1. operatori condizionali sono utili per brevi dichiarazioni. L'assegnazione variabile di J-P è un ottimo esempio: var a = x ? 1 : 2;
  2. Le clausole multi-istruzione devono essere separate su righe separate, per essere leggibili.
  3. Gli operatori condizionali possono essere resi leggibili come istruzioni multilinea con il rientro corretto, ma la sintassi if/else è molto più familiare per la maggior parte degli sviluppatori. La leggibilità riguarda la corrispondenza con le aspettative del tuo lettore, quindi la familiarità è importante.

Aggiungo che gli operatori condizionali su più righe ti lasciano aperti agli errori di inserimento del punto e virgola. Controlla lo JSLint documentation (consulta la sezione "Interruzione della linea") per ulteriori informazioni. Se è necessario utilizzare un operatore condizionale su più righe, assicurarsi che gli operatori si trovino alla fine di ogni riga. Vorrei rielaborare esempio multi-linea di J-P nel seguente modo:

(something && somethingElse > 2) ? 
    doSomeLongFunctionName() : 
    doSomeOtherLongFunctionName(); 

Come è stato detto, ci sono molte guide di stile là fuori e si può scegliere se si preferisce. Alcune scelte sono però più inclini agli errori di altre. Dare un'occhiata da vicino a quello JSLint documentation; è una guida di stile molto ben congegnata e, se ci si attiene, è persino possibile utilizzare lo strumento JSLint per verificare automaticamente il codice per potenziali problemi.