Was ist falsch an diesem "switch"?
ottogal
- javascript
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
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.
Weil switch mit strict comparison arbeitet sind
3
und"3"
nicht gleich.
Danke!
case 3:
statt case "3":
hilft ab.
Hallo dedlfix,
ich habe die beiden Wiki-Artikel zu switch mal diesbezüglich überarbeitet.
Rolf
Danke, Rolf!
Gibt es einen Grund, dass JS bei switch den strengeren Typvergleich macht, oder ist das halt nur so passiert?
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
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
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.
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
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
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.
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...
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.
Ja, dass Javascript sonst so "tolerant" mit den Typen ist, wird immer wieder zum Stolperstein...