2012-06-17 20 views
229

Posso scrivere la 'if else' scorciatoia senza l'altro?Javascript if else stenografia

esempio:

var x=1; 

x==2? dosomething:doNothingButContinueCode; 

ho notato mettere 'null' altro per le opere, ma non ho idea del perché o se questa è una buona idea.

EDIT: Alcuni di voi sembrano divertito perché mi piacerebbe provare questo fastidio. Siate certi che è puramente per curiosità. Mi piace scherzare con js.

+0

Penso che ci sia un 'var | sintassi var'. Attento perché è potenzialmente difficile "vedere", in particolare i ternari (IMO) sono problematici. Usare con parsimonia. –

+0

@JaredFarrish L'intero punto delle ternarie non è che è più facile "vedere" che usare le istruzioni if? Inoltre, di quale sintassi stai parlando, sembra interessante. – Hassan

+1

No, non penso che siano più facili in tutti i casi. Il "punto centrale" nella mia mente è quello di mettere tutto su una riga ("i miei codici più corti dei tuoi") o per casi specifici, letterali con esiti semplicistici. I ternari impilatori sono particolarmente perniciosi e dovrebbero essere evitati a tutti i costi. ':)' –

risposta

209

Questa è anche un'opzione:

x == 2 && dosomething(); 

dosomething() saranno chiamati solo se x == 2. Questo è chiamato Short-circuiting.

Non è comunemente usato in casi come questo e in realtà non si dovrebbe scrivere codice come questo. Incoraggio questo approccio invece:

if(x == 2) { dosomething(); } 

Si dovrebbe scrivere codice leggibile in ogni momento; se sei preoccupato per le dimensioni del file, creane una versione ridotta con l'aiuto di uno dei migliaia di compressori JS. (Mi raccomando di Google Closure Compiler)

+7

Oh, cortocircuito, a destra . La leggibilità del codice è sotto apprezzata credo nella maggior parte degli sviluppatori intermedi e di alcuni "professionisti esperti". –

+2

Tecnicamente non è necessario le parentesi: 'se (1 - 1 === 0) $ ('Woot. ') Testo (' Woot!');' io uso quella forma tutto il tempo con. PHP, e ora che sto adottando Coffeescript, lo uso anche nel mio Javascript. –

+4

Personalmente credo che se è un piccolo se con un risultato se è vero ... è più veloce e più facile scrivere x == 2 && dosomething(); –

15

se non stai facendo la cosa, perché non fare:

if (x==2) doSomething(); 
+4

lo puoi fare anche se fai il resto – nmirceac

10

Utilizzando null va bene per uno dei rami di un espressione ternaria. E un'espressione ternaria va bene come affermazione in Javascript.

Come una questione di stile, però, se avete in mente invocare una procedura, è più chiaro a scrivere questo utilizzando if..else:

if (x==2) doSomething; 
else doSomethingElse 

o, nel tuo caso,

if (x==2) doSomething; 
3

Tecnicamente, mettendo nullo o 0, o semplicemente un po 'di valore casuale ci lavora (dal momento che non si utilizza il valore di ritorno). Tuttavia, il motivo per cui stai usando questo costrutto al posto del if costrutto? È meno ovvio ciò che stai cercando di fare quando scrivi codice in questo modo, poiché potresti confondere le persone con il no-op (null nel tuo caso).

676

Quello che hai è un uso abbastanza insolito di ternary operator. Di solito è usato come un'espressione, non una dichiarazione, all'interno di qualche altra operazione, ad esempio:

var y = (x == 2 ? "yes" : "no"); 

Quindi, per migliorare la leggibilità (perché quello che stai facendo è insolito), e perché evita il "altro" che non si vuole, vorrei suggerire:

if (x==2) doSomething(); 
+0

Qui possiamo aggiungere il traguardo inserito come comando completo (come nel mio esempio usa la funzione jquery fade in e fade out) x == 2? $ (elemento) .fadeIn(): $ (elemento) .fadeIn(); Non è obbligatorio avere una variabile di ritorno (come var y nel primo codice). – Prageeth

+1

è necessario utilizzare i segni tripli "=" perché la logica sia perfetta. come in var y = (x === 2? "sì": "no"); – fino

+2

@fino Questo è vero tecnicamente, ma se viene usato quando non strettamente necessario, '===' spesso causa più problemi di quanti ne risolva. Ad esempio, dovresti * davvero * voler che '2' corrisponda, ma non' "2" '? JavaScript (e lingue simili) rendono facile non preoccuparsi di quale sia; ad esempio, l'input dell'utente da un campo di testo sarà una stringa e può essere confrontato con un Number-2 con '==' senza conversione. '===' causerebbe un problema lì. – Nicole

48

Un'altra opzione:

x === 2 ? doSomething() : void 0; 
+2

Se qualcuno non sa perché usare void 0 suggerisco di leggere questo [collegamento] (https://stackoverflow.com/questions/7452341/what-does-void-0-mean) – Carlinhos

4

Una piccola aggiunta a questo, molto vecchio filo molto ..

Diciamo your'e all'interno di un ciclo for e la necessità di valutare una variabile per un valore truthy/falsy con un operatore ternario, mentre nel caso in cui si tratta di falsy si vuole continue - hai intenzione di avere un problema, perché non restituire un your'e espressione, si restituisce invece una affermazione senza alcun valore.

Questo produrrà Uncaught SyntaxError: Unexpected token continue

for (var i = 0; i < myArray.length; i++) { 
     myArray[i].value ? alert('yay') : continue; 
} 

Quindi, se si vuole restituire una dichiarazione e ancora utilizzare una riga per il codice, anche se può sembrare un po 'strano a prima vista e non può seguire rigoroso uso della lingua , si può fare questo, invece:

for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i].value) alert('yay') ; else continue; 
    } 
  • PS - questo codice può essere difficile da leggere o capire in modo che non sarà sempre l'opzione migliore da utilizzare. Sto solo dicendo .. :)