2012-07-19 10 views
20

Così sto usando una scorciatoia javascript if/else economico (ho letto da qualche parte si chiamano affermazioni ternari?)javascript stenografia if, senza la parte altra

this.dragHandle.hasClass('handle-low') ? direction = "left" : direction = "right"

Questa grande opera, ma cosa succede se in seguito voglio usare solo una stenografia if, senza la porzione else. Come:

direction == "right" ? slideOffset += $(".range-slide").width()

Questo è possibile a tutti?

+3

Il termine tecnico per questi frammenti è _ espressioni condizionali_, che utilizzano l'operatore condizionale '?:'. Poiché questo operatore accetta tre operandi, è chiamato operatore ternario. –

+2

2 volte più veloce http://jsperf.com/speed-test-for-conditions –

risposta

32

è possibile utilizzare && operatore - seconda espressione operando viene eseguito solo se prima è vero

direction == "right" && slideOffset += $(".range-slide").width() 

a mio parere if(conditon) expression è più leggibile rispetto condition && expression

+0

probabilmente rimarrà con 'if (condition) expression' - ma è bello sapere che l'operatore' && 'funziona in questa situazione! – ahren

+1

look '&&' è più veloce per me http://jsperf.com/speed-test-for-conditions –

+0

Ho usato prima le virgolette doppie e ha funzionato ... qualcosa come >>> direction == "right"? slideOffset + = $ (". range-slide"). width(): "" .... quindi questo crea problemi? – hsobhy

2

No, questo non è possibile, perché l'operatore ternario richiede tre operandi.

first-operand ? second-operand (if first evaluates to true) : third-operand (if false) 
2

Quello che hai non funziona, ma perché non usare solo una riga se la dichiarazione invece.

if(direction == "right") slideOffset += $(".range-slide").width();

Questo comporta meno di battitura rispetto al metodo suggerito Ray. Ovviamente la sua risposta è valida se si vuole davvero attenersi a quel formato.

0

Questo non è esattamente rispondere alla tua domanda, ma ternari permettono di scrivere meno di quanto si hai mostrato:

direction = this.dragHandle.hasClass('handle-low') ? "left" : "right"; 

E ora che ci penso, sì, si può fare la tua domanda anche:

slideOffset + direction == "right" ? = $(".range-slide").width() : = 0; 

Questa è una teoria. La prossima volta che avrò l'opportunità di provare un ternario allo +=, lo proverò. Fammi sapere come funziona!

+0

La cosa divertente è che potrebbe funzionare. Sto iniziando a non piacermi questo sito – Dale

+0

La linea superiore funziona assolutamente – Dale

9

Non pensare a come un controllo- blocco (es .: un if-else o un interruttore). Non è veramente pensato per eseguire il codice al suo interno.

È possibile. Diventa molto brutto, molto veloce, che sconfigge lo scopo.

cosa si vuole veramente usarlo per è assegnazione di valori.

Prendendo il vostro esempio iniziale e girando sulla sua testa un po ', si ottiene:

direction = (this.dragHandle.hasClass("handle-low")) ? "left" : "right"; 

Sede. Ora quello che ho fatto è che ho preso qualcosa che avrebbe richiesto un if/else o un interruttore, che sarebbe stato usato per assegnare a quel valore, e l'ho pulito bene.

Si può anche fare un altro, se il tipo di ternario:

y = (x === 2) ? 1 : (x === 3) ? 2 : (x === 4) ? 7 : 1000; 

È inoltre possibile utilizzarlo per sparare codice, se vuoi, ma diventa davvero difficile dopo un po ', di sapere cosa sta andare dove (si veda l'esempio precedente per vedere come anche assegnazione può iniziare a guardare strano a colpo d'occhio) ...

((this.dragHandle.hasClass("...")) ? fireMe(something) : noMe(somethingElse)); 

... questo sarà tipicamente funzionerà.

Ma in realtà non è più carino o più utile di una funzione di if o branching, che richiama immediatamente (e programmatori non JS, o programmatori JS non addestrati stanno per schifarsi cercando di mantenere il proprio codice).

+1

"_untrained I programmatori JS stanno per schifarsi cercando di mantenere il tuo codice_" Non avrei potuto dirlo meglio – ajax333221

2

L'operatore condizionale è non una stenografia per l'istruzione if. È un operatore, non una dichiarazione.

Se lo si utilizza, è necessario utilizzarlo come operatore, non come istruzione.

Basta usare un valore pari a zero per il terzo operando:

slideOffset += direction == "right" ? $(".range-slide").width() : 0; 
0

ho avuto un caso simile in cui ho voluto chiamare solo la parte if. Ottenuto utilizzando l'operatore logico & & (e).

var name = "michael"; 

var doSomething = function() { 
    return (name === "michael") && console.log("name is valid"); 
}; 

doSomething(); // will log name is valid else returns undefined but is disposed of since we never store it. 
Problemi correlati