2010-05-28 13 views
70

Ho sempre dovuto inserire null nelle altre condizioni che non hanno nulla. C'è comunque intorno ad esso? Per esempio.Operatori ternari in JavaScript senza "altro"

condition ? x = true : null; 

in fondo, c'è un modo per farlo:

condition ? x = true; 

Ora si presenta come un errore di sintassi

Cordiali saluti, ecco alcune vero e proprio codice di esempio:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null; 
+13

uso di una condizione simile a ternario?x = true: null; 'dovrebbe probabilmente essere scritto come' x = (condizione? true: null); '. Per inciso, in javascript 'null' restituisce false, quindi in questo caso potresti' x = (condition); 'e ottieni lo stesso risultato. –

+0

matt, la tua risposta è la migliore, ma non è una risposta, è un commento! – Cheeso

+0

Matt, il mio codice ACTUAL è:! Defaults.slideshowWidth? defaults.slideshowWidth = obj.find ('img'). width() + 'px': null; un modo più breve e migliore per scriverlo? –

risposta

129

Prima di tutto, l'espressione ternaria non è un sostituto per un if/else costrutto - la sua un equivalente ad un if/else costrutto che restituisce un valore. Cioè, una clausola if/else è codice, un'espressione ternaria è un'espressione , che significa che restituisce un valore.

significa diverse cose:

  • usano espressioni ternari solo quando si dispone di una variabile sul lato sinistro del = che deve essere assegnato il valore di ritorno
  • solo utilizzare le espressioni ternari quando il valore restituito deve essere uno dei due valori (o utilizzare espressioni nidificate se è appropriato)
  • ogni parte dell'espressione (dopo? e dopo:) deve restituire un valore senza effetti collaterali (l'espressione x = true restituisce true come tutte le espressioni restituiscono il valore ultimo valore, ma cambia anche x senza tx avendo alcun effetto sul valore restituito)

In breve - l'uso 'corretta' di un'espressione ternario è

var resultofexpression = conditionasboolean ? truepart: falsepart; 

Invece di vostro esempio condition ? x=true : null ;, in cui si utilizza l'espressione ternaria per impostare il valore della x, è possibile utilizzare questo:

condition && (x = true); 

questo è ancora un'espressione e potrebbe quindi non passa la convalida, quindi un approccio ancora migliore sarebbe

void(condition && x = true); 

L'ultimo passerà la convalida.

Ma poi di nuovo, se il valore previsto è un valore booleano, basta utilizzare il risultato della condizione espressione stessa

var x = (condition); // var x = (foo == "bar"); 

UPDATE In relazione a vostro campione questo è probabilmente più appropriato:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px'; 
+1

L'ho usato per '(! Something && doSomething());', grazie. – Droogans

+1

SO brillante, non permettendo la modifica per correggere l'errore 'i/else' in quanto non è sufficiente caratteri. – dewd

+0

void (condizione && x = true) - questo sembra ottimo ma sembra gettare "assegnazione non valida lato sinistro" errore –

14

No, ha bisogno di tre operandi. Ecco perché si chiamano operatori ternari.

Tuttavia, per quello che avete come vostro esempio, si può fare questo:

if(condition) x = true; 

Anche se è più sicuro di avere bretelle, se avete bisogno di aggiungere più di una dichiarazione in futuro:

if(condition) { x = true; } 

Edit: Ora che si parla il codice vero e proprio in cui la vostra domanda vale per:

if(!defaults.slideshowWidth) 
    { defaults.slideshowWidth = obj.find('img').width()+'px'; } 
+0

Puoi, ma non dovresti. Atleast non senza parentesi graffe intorno ad esso - è molto errorprone. – Konerak

+1

è vero? Ho capito che la ragione principale per cui si richiedono i ricci è perché rendono più facile la vita a jslint. – Cheeso

+0

@Cheeso è errorprone nel senso del refactoring. Ritornate ad aggiungere altro da fare nel caso di una vera condizione senza rendervi conto che non ci sono parentesi graffe lì. Il nuovo codice verrà sempre eseguito anziché nel caso di true. –

9
var x = condition || null; 
+0

vedere il mio codice live, comunque per abbatterlo? –

+2

'(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find ('img'). width() + 'px') 'o' defaults.slideshowWidth = defaults.slideshowWidth || (obj.find ('img'). width() + 'px') ' –

+0

> Restituisce expr1 se può essere convertito in true; in caso contrario, restituisce expr2. [Logical Operators (MDN)] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Description) –

3

Si potrebbe scrivere

x = condition ? true : x; 

In modo che x è non modificato quando la condizione è falsa.

Questo poi equivale a

if (condition) x = true 

EDIT:

!defaults.slideshowWidth 
     ? defaults.slideshowWidth = obj.find('img').width()+'px' 
     : null 

ci sono un paio di alternative - non sto dicendo queste sono meglio/peggio - semplicemente alternative

Passing in null come il terzo parametro funziona perché il valore esistente è nullo. Se rifattori e cambi la condizione, allora c'è il pericolo che questo non sia più vero. Passando il valore exising come il 2 ° scelta delle guardie ternari contro questo:

!defaults.slideshowWidth = 
     ? defaults.slideshowWidth = obj.find('img').width()+'px' 
     : defaults.slideshowwidth 

più sicuro, ma forse non così piacevole da guardare, e più di battitura. In pratica, probabilmente sarei scrivo

defaults.slideshowWidth = defaults.slideshowWidth 
       || obj.find('img').width()+'px' 
+0

Qualche codice live è (comunque per sbarazzarsi del null in questo?):! defaults.slideshowWidth? defaults.slideshowWidth = obj.find ('img'). width() + 'px': null; –

1

Nel tuo caso vedo l'operatore ternario come ridondante. È possibile assegnare la variabile direttamente all'espressione, utilizzando gli operatori ||, & &.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ; 

diventerà:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px'; 

E 'più chiaro, è più stile "javascript".

4

Il più delle volte la gente ottenere l'uso degli operatori logici per abbreviare la sintassi dell'istruzione:

!defaults.slideshowWidth && 
    (defaults.slideshowWidth = obj.find('img').width()+'px'); 

Ma nel tuo caso particolare la sintassi può essere ancora più semplice

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px'; 

Questo codice restituirà il valore defaults.slideshowWidth se il valore defaults.slideshowWidth viene valutato su true e il valore obj.find('img').width()+'px' in caso contrario.

Vedere il Short-Circuit Evaluation degli operatori logici per i dettagli.

Problemi correlati