Frage zu Kurzschreibweise
WernerK
- javascript
Hallo,
in einem JS Script habe ich folgendes gefunden:
// on=1 or off=2
var My_Mode = 1;
(My_Mode) ? zeige(elementX) : ausblenden(elementX);
Wenn ich es richtig verstehe ist my_mode auf 1 gesetzt und dann sollte doch vermutlich zeige(elementX) ausgeführt werden. Da passiert aber nichts. Man sieht dieses Element nicht. Oder müsste das mit true und false gemacht werden?
Danke Werner
Hallo,
Oder müsste das mit true und false gemacht werden?
Das ist auf jeden Fall empfehlenswert. Die beiden Werte 1 und 2 sollten von JS beide als true ausgewertet werden. Warum die Funktion trotzdem nichts bewirkt, geht aus dem Gezeigten m.E. nicht hervor.
Gruß
Kalk
@@WernerK
// on=1 or off=2 var My_Mode = 1; (My_Mode) ? zeige(elementX) : ausblenden(elementX);
Wenn ich es richtig verstehe ist my_mode auf 1 gesetzt und dann sollte doch vermutlich zeige(elementX) ausgeführt werden.
Ja, wird es.
Da passiert aber nichts. Man sieht dieses Element nicht.
Was ergibt dein Debugging?
Da wir nicht wissen, was zeige()
macht, können wir dir (noch) nicht weiterhelfen.
Oder müsste das mit true und false gemacht werden?
Der Wert 2 für off wird auch als truthy gewertet; es wird auch zeige(elementX)
aufgerufen.
Man könnte für off den Wert 0 nehmen (klingt auch plausibler als 2); 0 wird als falsy gewertet, ausblenden(elementX)
wird aufgerufen.
Oder auf den Wert prüfen: (My_Mode === 1) ? zeige(elementX) : ausblenden(elementX);
LLAP 🖖
sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
Hallo,
Danke an alle für die Infos.
So hätte ich auch was damit anfangen können.
(My_Mode === 1) ? zeige(elementX) : ausblenden(elementX);
oder auch mit true oder false oder wenigstens 0 und 1. Ich weiss leider nicht was der Entwickler sich damals dabei gedacht hatte.
Gruss Werner
Hi,
So hätte ich auch was damit anfangen können.
(My_Mode === 1) ? zeige(elementX) : ausblenden(elementX);
oder auch mit true oder false oder wenigstens 0 und 1. Ich weiss leider nicht was der Entwickler sich damals dabei gedacht hatte.
ich vermute schlicht und ergreifend einen falschen Kommentar, und dass der ursprüngliche Entwickler tatsächlich 1 und 0 gemeint hat.
Ciao,
Martin
Tach!
Zur eigentlichen Frage haben die anderen beiden ja schon etwas geschrieben und ich beziehe mich nur auf einen Nebenkriegsschauplatz.
in einem JS Script habe ich folgendes gefunden:
// on=1 or off=2 var My_Mode = 1; (My_Mode) ? zeige(elementX) : ausblenden(elementX);
So sollte man den ternären Operator (?:) nicht verwenden. Er ist nicht als Alternativschreibweise für if-else gedacht. Obwohl er auch in ähnlichen wie dem vorliegenden Fall funktioniert, ist doch sein Hauptzweck, ein Ergebnis in Abhängigkeit von einer Bedingung zu liefern. In dem Fall wird das Ergebnis komplett ignoriert, ja selbst die aufgerufenen Funktionen scheinen nicht mal eins zu liefern. Statt etwas zu verwenden, von dem man nur die Hälfte der Funktionalität nutzt, finde ich, sollte man lieber etwas passenderes nehmen, auch wenn es dadurch etwas länger wird.
if (My_Mode == 1) {
zeige(elementX);
} else {
ausblenden(elementX);
}
Wenn man es denn im vorliegenden Fall als Einzeiler haben möchte, kann man ja immer noch
document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none';
Obwohl den Style direkt zu setzen jetzt auch nicht grad die beste Kinderstube ist. Dann besser so, moderne Browser vorausgesetzt und dass die Sichtbarkeit über die Klasse active im Stylesheet geregelt ist:
if (My_Mode == 1) {
document.querySelector(elementX).classList.add('active');
} else {
document.querySelector(elementX).classList.remove('active');
}
Und wie schon anderswo erwähnt, lieber true/false statt 1/2 nehmen.
dedlfix.
Hallo,
document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none';
darf man hier die Klammern um My_Mode == 1
einfach weglassen?
Gruß
Kalk
Hi,
document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none';
darf man hier die Klammern um
My_Mode == 1
einfach weglassen?
ich bin auch über die Schreibweise ganz ohne Klammern gestolpert. Syntaktisch "darf" man das natürlich, es ist ja nur eine Verkettung von Operatoren. Die Frage ist, welcher Operator wie stark bindet. Und da ich diese Priorität der Operatoren schon ab und zu falsch eingeschätzt habe, würde ich auch eher für Klammern plädieren.
Allerdings würde ich den gesamten ternären Ausdruck in Klammern setzen. Letztendlich ist das aber auch wieder eine Frage der Gewohnheit und des persönlichen Geschmacks.
Ciao,
Martin
Tach!
document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none';
darf man hier die Klammern um
My_Mode == 1
einfach weglassen?
Es gibt keine Pflicht, Ausdrücke in Klammern zu setzen, auch nicht beim condition-Ausdruck vom conditional (ternary) Operator. Man muss sie lediglich schreiben, wenn die Eindeutigkeit ansonsten nicht gegeben ist. (Bei if gehören die Klammern nicht zum Ausdruck, sondern zur Syntax vom Statement.)
dedlfix.
document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none'; darf man hier die Klammern um
My_Mode == 1
einfach weglassen?
Ja. Der Ternary Operator wird im Rang nur von Zuweisung und Komma untertroffen. Im Zweifelsfalle schaue man >hier<, ich habe lange genug daran gebastelt :)
Rolf
Alles soweit richtig. Nur:
Und wie schon anderswo erwähnt, lieber true/false statt 1/2 nehmen.
Naja. Nicht ganz. Für mich sieht es so aus, als habe der Entwickler mal im Auge gehabt, dass My_Mode
nicht nur 2 Werte annehmen kann und das mit dem Einzeiler dann sozusagen aus Faulheit über den Haufen geworfen.
Wenn es der Plan war, dass in My_Mode
womöglich oder künftig mehr als nur zwei (kodierte) Zustände gespeichert werden, dann wäre wohl ein switch/case-Konstrukt das passende gewesen.
@@Naja, nicht ganz-Sager
Und wie schon anderswo erwähnt, lieber true/false statt 1/2 nehmen.
Naja. Nicht ganz. Für mich sieht es so aus, als habe der Entwickler mal im Auge gehabt, dass
My_Mode
nicht nur 2 Werte annehmen kann und das mit dem Einzeiler dann sozusagen aus Faulheit über den Haufen geworfen.
Dann wäre 1, 2, 3, … immer noch suboptimal.
In dem Fall sollte man sich Konstanten definieren und im Weiteren nur noch mit diesen arbeiten.
const MODE_ON = 1;
const MODE_OFF = 2;
if (MyMode === MODE_ON) { … }
LLAP 🖖
sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
Tach!
Dann wäre 1, 2, 3, … immer noch suboptimal.
In dem Fall sollte man sich Konstanten definieren und im Weiteren nur noch mit diesen arbeiten.
Das ist deswegen suboptimal, weil man den nackigen Zahlenwerten ihre Bedeutung nicht ansehen kann. Besonders herausfordernd ist das, wenn die gleichen Zahlenwerte in anderem Zusammenhang für andere Dinge stehen, und man es schwer hat, diese Bedeutungen zu unterscheiden. Auch Suchen und Ersetzen ist mit eindeutigen Bezeichnern einfacher als mit Zahlen. Diese Betrachtung gilt übrigens auch für Strings. Strings als Daten sowieso oder als Feldnamen in Arrays sind sie meist problemlos, aber Strings mit Bedeutung für den Programmablauf (so genannte Magic Strings) sind auch besser als Konstanten verwendet.
Diese Empfehlung dient also dem Lesen und Verstehen des Codes und hat weniger einen technischen Hintergrund.
dedlfix.
Ich finde am Verwenden der Kostanten nichts Negatives. In PHP wird das ja "ab Werk" auch so gemacht.
Hallo,
My_Mode
womöglich oder künftig mehr als nur zwei (kodierte) Zustände
Da bin ich jetzt gespannt, was du dir noch für Modus neben „zeigen“ und „ausblenden“ vorstellen kannst.
Gruß
Kalk
Tach!
Da bin ich jetzt gespannt, was du dir noch für Modus neben „zeigen“ und „ausblenden“ vorstellen kannst.
Wie wäre es mit beliebigen Stufen von Transparenz?
dedlfix.
Hallo,
My_Mode
womöglich oder künftig mehr als nur zwei (kodierte) ZuständeDa bin ich jetzt gespannt, was du dir noch für Modus neben „zeigen“ und „ausblenden“ vorstellen kannst.
Gruß
Jürgen