Ternaire operatoren in JavaScript zonder “else”

Ik heb altijd nullin de else-voorwaarden moeten zetten die niets hebben. Is er een manier om het te omzeilen?

Bijvoorbeeld

condition ? x = true : null;

Kortom, is er een manier om het volgende te doen?

condition ? x = true;

Nu wordt het weergegeven als een syntaxisfout.

Ter info, hier is een echte voorbeeldcode:

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

Antwoord 1, autoriteit 100%

Ten eerste is een ternaire expressie geen vervanging voor een if/else-constructie – het is een equivalent van een if/else-constructie die een waarde retourneert. Dat wil zeggen, een if/else-clausule is code, een ternaire expressie is een expressie, wat betekent dat het een waarde retourneert.

Dit betekent verschillende dingen:

  • gebruik alleen ternaire expressies als je een variabele hebt aan de linkerkant van de =waaraan de retourwaarde moet worden toegewezen
  • gebruik alleen ternaire expressies als de geretourneerde waarde een van twee waarden moet zijn (of gebruik geneste expressies als dat passend is)
  • elk deel van de uitdrukking (na ? en na : ) moet een waarde retourneren zonder bijwerkingen (de uitdrukking x = trueretourneert true omdat alle uitdrukkingen de laatste waarde retourneren, maar het verandert ook x zonder dat x enig effect heeft op de geretourneerde waarde)

Kortom – het ‘juiste’ gebruik van een ternaire uitdrukking is

var resultofexpression = conditionasboolean ? truepart: falsepart;

In plaats van uw voorbeeld condition ? x=true : null ;, waar je een ternaire expressie gebruikt om de waarde van xin te stellen, kun je dit gebruiken:

condition && (x = true);

Dit is nog steeds een uitdrukking en kan daarom niet door de validatie komen, dus een nog betere benadering zou zijn

void(condition && x = true);

De laatste slaagt voor validatie.

Maar nogmaals, als de verwachte waarde een boolean is, gebruik dan gewoon het resultaat van de voorwaarde-expressie zelf

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

UPDATE

Met betrekking tot uw steekproef is dit waarschijnlijk meer geschikt:

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

Antwoord 2, autoriteit 10%

Nee, het heeft drie operanden nodig. Daarom worden ze ternaireoperators genoemd.

Voor wat u echter als voorbeeld heeft, kunt u dit doen:

if(condition) x = true;

Hoewel het veiliger is om een ​​beugel te gebruiken als u in de toekomst meer dan één uitspraak moet toevoegen:

if(condition) { x = true; }

Bewerken:Nu je de eigenlijke code vermeldt waarop je vraag van toepassing is:

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

Antwoord 3, autoriteit 5%

Vaak gebruiken mensen logische operatoren om de syntaxis van de instructie in te korten:

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

Maar in uw specifieke geval kan de syntaxis nog eenvoudiger zijn:

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

Deze code retourneert de waarde defaults.slideshowWidthals de defaults.slideshowWidthwordt geëvalueerd als true en obj.find('img').width() + 'px'waarde anders.

Zie Short -Circuit Evaluatievan logische operators voor details.


Antwoord 4, autoriteit 4%

var x = condition || null;

Antwoord 5, autoriteit 3%

Je zou kunnen schrijven

x = condition ? true : x;

Zodat x ongewijzigd blijft als de voorwaarde onwaar is.

Dit is dan gelijk aan

if (condition) x = true

BEWERKEN:

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

Er zijn een paar alternatieven – ik zeg niet dat deze beter/slechter zijn – alleen alternatieven

Null doorgeven als derde parameter werkt omdat de bestaande waarde null is. Als u de toestand refactoreert en wijzigt, bestaat het gevaar dat dit niet langer waar is. Het doorgeven van de bestaande waarde als 2e keuze in het ternaire beschermt hiertegen:

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

Veiliger, maar misschien niet zo mooi om naar te kijken, en meer typen. In de praktijk zou ik waarschijnlijk schrijven

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

Antwoord 6

In jouw geval zie ik de ternaire operator als overbodig. U kunt de variabele rechtstreeks aan de uitdrukking toewijzen met behulp van ||, && operators.

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

wordt :

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

Het is duidelijker, het is meer “javascript”-stijl.


Antwoord 7

Wat dacht je van gewoon

   if (condition) { code if condition = true };

Antwoord 8

Als u een ternaire operator wilt gebruiken zonder elsein een array of objectdeclaratie, kunt u de ES6spread-operator, ...():

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

En voor objecten:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

Originele bron

Other episodes