Omettere la seconda espressione quando si utilizza la scorciatoia if-else


290

Posso scrivere la if elsestenografia senza il else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

Ho notato che mettere nullper il resto funziona (ma non ho idea del perché o se sia una buona idea).

Modifica: Alcuni di voi sembrano confusi perché mi preoccuperei di provare questo. State tranquilli che è puramente per curiosità. Mi piace scherzare con JavaScript.


Penso che ci sia una var | varsintassi. Attento in quanto è potenzialmente difficile "vedere", specialmente i ternari (IMO) sono problematici. Usa con parsimonia.
Jared Farrish,

@JaredFarrish Non è forse più facile "vedere" il punto di ternari che usare if? Inoltre, qual è la sintassi di cui stai parlando, sembra interessante.
Hassan,

1
No, non credo che siano più facili in tutti i casi. Il "punto intero" nella mia mente è quello di mettere tutto su una riga ("i miei codici più brevi dei tuoi") o per casi letterali specifici con esiti semplicistici. L'impilamento di ternari è particolarmente dannoso e dovrebbe essere evitato a tutti i costi. :)
Jared Farrish,

1
@Hassan - Ho visto qualcosa del genere foo = bar | cat;, dove se il primo è falso? null ?, "cade" al secondo. L'ho visto solo, però, e non lo uso.
Jared Farrish,

3
@JaredFarrish: Questo è a || bo a && b, altrimenti bverrà sempre valutato.
kennytm,

Risposte:


263

Questa è anche un'opzione:

x==2 && dosomething();

dosomething()verrà chiamato solo se x==2valutato su vero. Questo si chiama Cortocircuito .

Non è comunemente usato in casi come questo e non dovresti davvero scrivere codice come questo. Incoraggio questo approccio più semplice:

if(x==2) dosomething();

Dovresti scrivere codice leggibile in ogni momento; se sei preoccupato per le dimensioni del file, creane una versione ridotta con l'aiuto di uno dei molti compressori JS. (ad esempio il compilatore di chiusura di Google )


10
Oh, corto circuito, giusto. La leggibilità del codice è sottovalutata, penso nella maggior parte degli sviluppatori intermedi e in alcuni "professionisti esperti".
Jared Farrish,

2
Tecnicamente non hai bisogno delle parentesi graffe: if (1 - 1 === 0) $('.woot').text('Woot!'); lo uso sempre con PHP, e ora che sto adottando Coffeescript, lo uso anche nel mio Javascript.
essere hollenbeck il

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

9
if x==2 && doSomething() || doSomethingElse()
Agustín,

1
Vorrei che Javascript incluso questa sintassi Ruby-tipo: doSomething() if x === 2. Non mi manca Ruby, ma mi manca.
Chad Johnson,

743

Quello che hai è un uso abbastanza insolito dell'operatore ternario . Di solito è usato come espressione, non come affermazione, all'interno di qualche altra operazione, ad esempio:

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

Quindi, per leggibilità (perché ciò che stai facendo è insolito) e perché evita "l'altro" che non vuoi, suggerirei:

if (x==2) doSomething();

Qui possiamo aggiungere il traguardo inserito come comando completo (come nel mio esempio utilizzare la funzione di dissolvenza in entrata e in uscita jquery) x == 2? $ (element) .fadeIn (): $ (element) .fadeIn (); Non è obbligatorio avere una variabile di ritorno (come var y nel primo codice).
Prageeth godage,

1
è necessario utilizzare i segni tripli "=" affinché la logica sia perfetta. come in var y = (x === 2? "yes": "no");
fino al

63

Un'altra opzione:

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

3
Se qualcuno non sa perché usare void 0, suggerisco di leggere questo link
Carlinhos,

20

Se non stai facendo l'altro, perché non farlo:

if (x==2) doSomething();

4
puoi farlo anche se fai l'altro
nmirceac

14

L'uso nullva bene per uno dei rami di un'espressione ternaria. E un'espressione ternaria va bene come un'istruzione in Javascript.

Per motivi di stile, però, se hai in mente di invocare una procedura, è più chiaro scriverlo usando if..else:

if (x==2) doSomething;
else doSomethingElse

o, nel tuo caso,

if (x==2) doSomething;

6

Piccola aggiunta a questo thread molto vecchio ..

Se stai valutando un'espressione all'interno di un for/ whileloop con un operatore ternario, e vuoi continueo breakcome risultato, avrai un problema perché entrambe continuee breaknon sono espressioni , sono dichiarazioni senza alcun valore.

Questo produrrà Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Se vuoi davvero un one-liner che restituisca una dichiarazione, puoi invece usare questo:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS: questo codice potrebbe sollevare alcune sopracciglia. Sto solo dicendo .. :)

4

Tecnicamente, mettendo null o 0, o solo qualche valore casuale lì funziona (dal momento che non si utilizza il valore restituito). Tuttavia, perché stai usando questo costrutto invece del ifcostrutto? È meno ovvio quello che stai cercando di fare quando scrivi il codice in questo modo, poiché potresti confondere le persone con il no-op (null nel tuo caso).


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.