WernerK: Frage zu Kurzschreibweise

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

  1. 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

  2. @@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 🖖

    --
    “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
    1. 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

      1. 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

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
  3. 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.

    1. Hallo,

      document.querySelector(elementX).style.display = My_Mode == 1 ? '' : 'none';
      

      darf man hier die Klammern um My_Mode == 1 einfach weglassen?

      Gruß
      Kalk

      1. 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

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      2. 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.

      3. 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

    2. 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.

      1. @@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 🖖

        --
        “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        1. 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.

        2. Ich finde am Verwenden der Kostanten nichts Negatives. In PHP wird das ja "ab Werk" auch so gemacht.

      2. 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

        1. 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.

        2. 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.

          • Anzeigen und vor dem Mauszeiger weglaufen.
          • In Spiegelschrift anzeigen.
          • Auf dem Kopf anzeigen (Gebietschema Australien).

          Gruß
          Jürgen