ottogal: Was ist falsch an diesem "switch"?

problematische Seite

Hallo in die Runde,

im verlinkten codepen sollte die switch-Anweisung dasselbe Resultat liefern wie die Folge von if-Anweisungen. Warum tut sie es nicht?

Schönen 4. Advent!
ottogal

  1. problematische Seite

    Tach!

    im verlinkten codepen sollte die switch-Anweisung dasselbe Resultat liefern wie die Folge von if-Anweisungen. Warum tut sie es nicht?

    Weil switch mit strict comparison arbeitet sind 3 und "3" nicht gleich.

    dedlfix.

    1. problematische Seite

      Weil switch mit strict comparison arbeitet sind 3 und "3" nicht gleich.

      Danke!
      case 3: statt case "3": hilft ab.

    2. problematische Seite

      Hallo dedlfix,

      ich habe die beiden Wiki-Artikel zu switch mal diesbezüglich überarbeitet.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. problematische Seite

        Danke, Rolf!
        Gibt es einen Grund, dass JS bei switch den strengeren Typvergleich macht, oder ist das halt nur so passiert?

        1. problematische Seite

          Hallo ottogal,

          Keine Ahnung. Mich hat das auch überrascht. Ich müsste Onkel Bing Googlesby und seine zwei Enten befragen. Dedlfix hat das gefunden, der weiß vielleicht auch den Grund.

          Die Spec sagt ihn nicht, da steht nur, dass es so ist. Es war vermutlich einfach schon immer so und es hat noch keiner hinterfragt.

          Und natürlich ist PHP mal wieder anderer Ansicht. Im PHP Handbuch steht ausdrücklich, dass switch/case "loose comparison" durchführt. Webentwickler sind bekanntlich leidensfähig.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. problematische Seite

            Hallo,

            Keine Ahnung. Mich hat das auch überrascht. Ich müsste Onkel Bing Googlesby und seine zwei Enten befragen.

            nett formuliert. 😀

            Die Spec sagt ihn nicht, da steht nur, dass es so ist. Es war vermutlich einfach schon immer so und es hat noch keiner hinterfragt.

            In PHP würde mir das einleuchten. Viele PHP-Funktionen liefern ein Ergebnis unterschiedlichen Typs, je nach Situation. Zum Beispiel false im Fehlerfall. aber eine Zahl (die auch 0 sein kann!) im Gutfall. Da würde ich mir auch im switch-Statement einen typsicheren Vergleich wünschen (ist das denn der Fall? Ich bin mir gerade nicht sicher).

            In Javascript sind mir solche Eiertänze im Moment nicht bewusst. Da wäre typentoleranter Vergleich also weniger problematisch.

            Und natürlich ist PHP mal wieder anderer Ansicht. Im PHP Handbuch steht ausdrücklich, dass switch/case "loose comparison" durchführt. Webentwickler sind bekanntlich leidensfähig.

            Super. Genau da, wo's sinnvoll wäre ...

            Immer eine Handbreit Wasser unterm Kiel
             Martin

            --
            Wenn ich den See seh, brauch ich kein Meer mehr.
          2. problematische Seite

            Tach!

            Dedlfix hat das gefunden, der weiß vielleicht auch den Grund.

            Nein. Da ich nicht auf die Idee komme, beim Verarbeiten von Zahlen die Zahlen als Stringliterale zu notieren, ist mir das auch nie begegnet.

            Und natürlich ist PHP mal wieder anderer Ansicht. Im PHP Handbuch steht ausdrücklich, dass switch/case "loose comparison" durchführt.

            Das würde ich nun nicht PHP anlasten, dass Javascript bei dem Konstrukt auf einmal typsicher vergleicht.

            dedlfix.

            1. problematische Seite

              Hallo dedlfix,

              "auf einmal" ist nicht das richtige Wort, schon in der ES3 Spec steht switch mit strengem Vergleich (hier, Seite 76, caseblock evaluation Punkt 3 und 9).

              D.h. es hat bisher einfach keiner von uns darauf geachtet oder irgendwas programmiert, wo es aufgefallen wäre. Schon seltsam...

              Rolf

              --
              sumpsi - posui - obstruxi
              1. problematische Seite

                Hallo,

                D.h. es hat bisher einfach keiner von uns darauf geachtet oder irgendwas programmiert, wo es aufgefallen wäre. Schon seltsam...

                nicht seltsam - eher ein Indiz für einen (zumindest in diesem Punkt) sauberen Programmierstil.

                Immer eine Handbreit Wasser unterm Kiel
                 Martin

                --
                Wenn ich den See seh, brauch ich kein Meer mehr.
              2. problematische Seite

                Tach!

                "auf einmal" ist nicht das richtige Wort,

                Wie man es nimmt.

                schon in der ES3 Spec steht switch mit strengem Vergleich (hier, Seite 76, caseblock evaluation Punkt 3 und 9).

                Mit der Version wurden auch typsichere Vergleiche eingeführt. Ich hatte erst gedacht, die kamen viel später, weil es erst später populär wurde, sie des Prinzips wegen als Standard-Operator einzusetzen, auch da wo es nichts bringt.

                "auf einmal", weil es diese Strictness vorher nicht gar und Javascript nach wie vor an vielen anderen Stellen keine Typgleichheit erfordert oder unterstützt (zum Beispiel bei Größer-/Kleiner-Vergleichen, Parameterübergaben).

                dedlfix.

            2. problematische Seite

              Da ich nicht auf die Idee komme, beim Verarbeiten von Zahlen die Zahlen als Stringliterale zu notieren, ist mir das auch nie begegnet.

              Da ich switch selten benutze, hatte ich für die richtige Syntax ins Wiki geschaut.
              Das Einführungsbeispiel bekommt die Eingaben über window.prompt, also als Text - obwohl der Nutzer ja Zahlen eingibt. Daher ist die Schreibung case "3": hier richtig.
              Ich wollte auch Zahlen verarbeiten (die freilich nicht über window.prompt kamen).
              So habe ich irrtümlich die falsche Syntax übernommen...

  2. problematische Seite

    Als Unterschied sehe ich eine Zahl einmal mit und einmal ohne Anführungszeichen.

    Ich weiß schon warum ich typisierte Sprachen mag. Die sagen mir in diesem Fall sofort dass ich hier was falsch formuliert habe.

    1. problematische Seite

      Ja, dass Javascript sonst so "tolerant" mit den Typen ist, wird immer wieder zum Stolperstein...