Christian Schubert: Frage zu logischen Operatoren

Hallo, danke für eure Zeit!

Ich habe da eine Frage zu logischen Operatoren in Javascript (vielleicht am besten erläutert anhand eines Fallbeispiels):

Warum gibt

  let Var 1;
  Var === 1 && console.log("Var ist 1!") || console.log("Var ist nicht 1!");

sowohl "Var ist 1!" als auch "Var ist nicht 1!" aus? (Sollte das Script nicht vor ODER Halt machen, da die erste Bedingung schon true zurückgibt?)

Wahrscheinlich übersehe ich hier etwas ganz Offensichtliches, trotzdem danke für Aufklärung!

LG, Christian.

  1. ...muss natürlich

    let Var = 1;
    

    heißen, entschuldigung

  2. Hallo Christian,

    Sollte das Script nicht vor ODER Halt machen, da die erste Bedingung schon true zurückgibt?

    Das ODER guckt nicht auf die erste Bedingung, sondern auf seinen linken Operanden. Der lautet Var === 1 && console.log("Var ist 1!"). Überleg Dir mal, was console.log zurückgibt und was das Ergebnis des && ist.

    Boolesche Operatoren sind hier aber nicht das Mittel der Wahl. Verwende den ternären Operator ?:, um den Meldungstext zu bestimmen.

    Und verwende keinesfalls den Variablennamen Var. var ist ein reserviertes Wort und Var ist dem viel zu ähnlich.

    let foo = 1;
    console.log(foo === 1 ? "foo ist 1" : "foo ist nicht 1");
    

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo,

      okay, es ist offensichtlich Zeit, eine kleine Pause einzulegen... 😆

      STIMMT, console.log() liefert ja selbst nicht true zurück 🤦‍♂️

      Müsste natürlich so formuliert sein (dann funktioniert es auch wie erwartet):

      console.log(Var === 1 && "Var ist 1!" || "Var ist nicht 1!");
      

      Und verwende keinesfalls den Variablennamen Var. var ist ein reserviertes Wort und Var ist dem viel zu ähnlich.

      Auch foo ist nur ein Dummy-Variablenname, als Platzhalter für sinnvollere Namensgebungen gedacht. Prinzipiell hast du aber vollkommen recht, darauf hinzuweisen - immerhin wird der Thread vielleicht auch von anderen gelesen, die sich dann daran ein schlechtes Beispiel nehmen, hatte ich nicht bedacht.

      Boolesche Operatoren sind hier aber nicht das Mittel der Wahl. Verwende den ternären Operator ?:, um den Meldungstext zu bestimmen.

      👍

      Der ternäre Operator war es, der die Verwirrung überhaupt erst gestiftet hat. Denn

      foo === 1 ? console.log("foo ist 1") : console.log("foo ist nicht 1");
      

      erzielt den gewünschten Effekt,

      foo === 1 && console.log("foo ist 1!") || console.log("foo ist nicht 1!");
      

      eben [logischerweise] nicht.

      Danke für deine Zeit.

      1. Bedenke aber bitte dass so ein Konstrukt zum Verständnis und als Lernfunktion sehr interresant ist, aber in ernsthaftem Code nichts zu suchen hat.

        Wenn nicht sogar du selbst irgendwann verfluchst dass du das so geschrieben hast, tut es vielleicht ein anderer.

  3. Hallo Christian,

    Warum gibt

      let Var 1;
      Var === 1 && console.log("Var ist 1!") || console.log("Var ist nicht 1!");
    

    sowohl "Var ist 1!" als auch "Var ist nicht 1!" aus? (Sollte das Script nicht vor ODER Halt machen, da die erste Bedingung schon true zurückgibt?)

    nein, für UND müssen ja beide Operanden true ergeben, also muss der zweite auch noch ausgewertet werden. Du hättest dann recht, wenn der erste Teilausdruck false ergeben würde.

    Live long and pros healthy,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
    1. Hallo Martin,

      danke für deine Antwort!

      (Meine Stellungnahme dazu siehe obige Antwort auf Rolfs Beitrag)

  4. Lieber Christian,

    in meinem Fall habe ich die Erfahrung gemacht, dass ich mit ungeklammerten Ausdrücken der Art a && b || c regelmäßig Schiffbruch erleide, weil ich sie schlicht nicht (gut genug) verstehe. Wenn ich dagegen Klammern setze, dann verstehe ich sie (besser):

    if (a && (b || c)) {
      //
    }
    
    if ((a && b) || c) {
      //
    }
    

    Du willst eine Log-Ausgabe. Was willst Du da wissen?

      let Var 1;
      Var === 1 && console.log("Var ist 1!") || console.log("Var ist nicht 1!");
    

    Du willst wissen, ob eine Variable einen bestimmten Wert hat. Das macht man üblicherweise so, dass man zuerst die Log-Methode aufruft und dann in den Klammern des Aufrufes notiert, was da auszugeben ist:

    console.log("ja was denn nun?");
    

    Der sogenannte ternäre Operator wurde hier ja schon angesprochen. Mit ihm ist die Ausgabe am besten lesbar und verständlich:

    console.log(bedingung ? "erfüllt" : "nicht erfüllt");
    
    console.log(
        Var === 1
        ? "Var ist 1!"
        : "Var ist nicht 1!"
    );
    

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      Schiffbruch erleide, weil ich sie schlicht nicht (gut genug) verstehe.

      Solange Du in PHP nicht sowas machst wie $boo11 AND $bool2 || $bool3 - was Dir dein Schiff unweigerlich auf den Grund setzt - kannst Du Dir für die Priorität und Assoziativität der Operatoren && als Multiplikation und || als Addition vorstellen, das ist vertraut und dann geht's besser.

      (Es sei denn, du gehört zu den Facebooktrollen, die die Aufgabe 1+2 ⋅ 3 = ? mit 7 statt mit 9 beantworten)

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf B,

        (Es sei denn, du gehört zu den Facebooktrollen, die die Aufgabe 1+2 ⋅ 3 = ? mit 7 statt mit 9 beantworten)

        Ich bin ein Facebooktroll.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. Hallo,

          (Es sei denn, du gehört zu den Facebooktrollen, die die Aufgabe 1+2 ⋅ 3 = ? mit 7 statt mit 9 beantworten)

          Ich bin ein Facebooktroll.

          Das halte ich für einen ungültigen Umkehrschluss!

          Gruß
          Kalk

      2. Lieber Rolf,

        Solange Du in PHP nicht sowas machst wie $boo11 AND $bool2 || $bool3 - was Dir dein Schiff unweigerlich auf den Grund setzt - kannst Du Dir für die Priorität und Assoziativität der Operatoren && als Multiplikation und || als Addition vorstellen, das ist vertraut und dann geht's besser.

        alles schön und gut, aber warum nicht lieber Klammern setzen? Meistens sind es ja keine Variablen, sondern Ausdrücke, die ich an diesen Stellen formuliere.

        (Es sei denn, du gehört zu den Facebooktrollen, die die Aufgabe 1+2 ⋅ 3 = ? mit 7 statt mit 9 beantworten)

        Wenn das immer so einfach aussehen würde, könnte man das auch so einfach erkennen...

        Liebe Grüße

        Felix Riesterer

      3. (Es sei denn, du gehört zu den Facebooktrollen, die die Aufgabe 1+2 ⋅ 3 = ? mit 7 statt mit 9 beantworten)

        Ist mir zu hoch?😨

    2. Hallo Felix Riesterer,

      console.log(
          Var === 1
          ? "Var ist 1!"
          : "Var ist nicht 1!"
      );
      

      1! = 0. (Eins Fakultät ist null.)

      Bis demnächst
      Matthias

      --
      Du kannst das Projekt SELFHTML unterstützen,
      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
      1. Hallo Matthias,

        Ich bin ein Facebooktroll.

        Nicht nur dort?

        $$1! == 0$$

        Welche Fächer unterrichtest Du noch gleich?

        $$0! == 1$$

        Das wäre ok.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf B,

          Nicht nur dort?

          Ups! Mir ging es eigentlich um die inflationäre Verwendung des Ausrufezeichens!

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    3. Hi,

      Der sogenannte ternäre Operator

      ich wäre da vorsichtig mit der Bezeichnung "Der ternäre Operator".

      Ja, das ist ein ternärer Operator. Und nach meinem Kenntnisstand derzeit auch der einzige derartige Operator.

      Aber was, wenn jemand einen weiteren Operator mit 3 Operanden erfindet? Z.B. den Dreiecksflächen-Operator Δ:

      A = 3 Δ 4 : 5;

      A enthält dann die Fläche des Dreiecks mit den gegebenen Seitenlängen.

      Uuuups, schon passiert - ?: ist nicht mehr DER ternäre Operator.

      Ich würde das ?: Teil eher "conditional operator" nennen oder, wenn's Deutsch sein soll, "Bedingungs-Operator".

      (ja, ich weiß, das ist hier nicht die erste Erwähnung dieses Operators im Thread, aber beim Lesen der anderen Erwähnungen hatte ich nicht die Zeit/Muße, meine Anmerkung zu formulieren)

      cu,
      Andreas a/k/a MudGuard

      1. Hallo,

        ich wäre da vorsichtig mit der Bezeichnung "Der ternäre Operator".

        Ja, das ist ein ternärer Operator. Und nach meinem Kenntnisstand derzeit auch der einzige derartige Operator.

        kurze Recherche: in SQL wird BETWEEN manchmal auch als ternärer Operator bezeichnet.

        Gruß
        Kalk

        1. Hi,

          Ja, das ist ein ternärer Operator. Und nach meinem Kenntnisstand derzeit auch der einzige derartige Operator.

          kurze Recherche: in SQL wird BETWEEN manchmal auch als ternärer Operator bezeichnet.

          ah stimmt, an den hab ich gar nicht gedacht. Dann gibt's ja jetzt schon drei ternäre Operatoren.

          cu,
          Andreas a/k/a MudGuard