Ik heb altijd null
in 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 = true
retourneert 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 x
in 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.slideshowWidth
als de defaults.slideshowWidth
wordt 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}