Ich musste immer null
die anderen Bedingungen eingeben, die nichts haben. Gibt es einen Ausweg?
Zum Beispiel,
condition? x = true: null;
Gibt es grundsätzlich eine Möglichkeit, Folgendes zu tun?
condition? x = true;
Jetzt wird es als Syntaxfehler angezeigt.
FYI, hier ist ein echter Beispielcode:
!defaults.slideshowWidth? defaults.slideshowWidth = obj.find('img').width()+'px': null;
Lösung des Problems
Zunächst einmal ist ein ternärer Ausdruck kein Ersatz für ein if/else-Konstrukt – er ist ein Äquivalent zu einem if/else-Konstrukt, das einen Wert zurückgibt. Das heißt, eine if/else-Klausel ist Code, ein ternärer Ausdruck ist ein Ausdruck, was bedeutet, dass er einen Wert zurückgibt.
Dies bedeutet mehrere Dinge:
- Verwenden Sie ternäre Ausdrücke nur dann, wenn Sie auf der linken Seite eine Variable haben
=
, der der Rückgabewert zugewiesen werden soll - Verwenden Sie nur ternäre Ausdrücke, wenn der zurückgegebene Wert einer von zwei Werten sein soll (oder verwenden Sie verschachtelte Ausdrücke, wenn dies passt).
- jeder Teil des Ausdrucks (nach? und nach: ) sollte einen Wert ohne Seiteneffekte zurückgeben (der Ausdruck
x = true
gibt wahr zurück, da alle Ausdrücke den letzten Wert zurückgeben, aber er ändert auch x, ohne dass x irgendeine Auswirkung auf den zurückgegebenen Wert hat)
Kurz gesagt – die „richtige" Verwendung eines ternären Ausdrucks ist
var resultofexpression = conditionasboolean? truepart: falsepart;
Anstelle Ihres Beispiels condition? x=true: null;
, in dem Sie einen ternären Ausdruck verwenden, um den Wert von x
festzulegen, können Sie Folgendes verwenden:
condition && (x = true);
Dies ist immer noch ein Ausdruck und besteht daher möglicherweise keine Validierung, daher wäre ein noch besserer Ansatz
void(condition && x = true);
Der letzte wird die Validierung bestehen.
Aber andererseits, wenn der erwartete Wert ein boolescher Wert ist, verwenden Sie einfach das Ergebnis des Bedingungsausdrucks selbst
var x = (condition); // var x = (foo == "bar");
AKTUALISIEREN
In Bezug auf Ihr Beispiel ist dies wahrscheinlich angemessener:
defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Keine Kommentare:
Kommentar veröffentlichen