Michael N.: zur Info: (1* 100) + 22 = 10022

Beitrag lesen

Hallo Kess,

Diese interessante Rechnung präsentierte mir heute der IE5. Mit anderen Browsern habe ich es noch nicht getestet.

Wenn ich mir Dein Beispiel so anschaue, bist Du in eine "altbekannte" Falle der impliziten Typen von JavaScript reingetappt.

Beispiel:
a = '1'
b = '22'
Man beachte, daß beide Variablen Strings enthalten.

Genau.

Für c = (a*100) + b errechnet der Browser entsprechend zunächst die Zahl 100

Klar, da die Konkatenierung von Strings nur mittels "+" geht, hier konvertiert der Interpreter implizit und gibt dann eine Zahl zurueck.

und will sie dann mit dem String '22' verknüpfen. Somit verwandelt er die Zahl 100 wieder in einen String '100'. Das Ergebnis ist dann ganz logisch '10022'.

Genau.

Für den Programmablauf ist das allerdings tödlich. Erst c = (a*100) + (b*1) liefert 122 zurück.

Ja klar, hier erzwingst Du dann zweimal die implizite Konvertierung.

Ist diese Befehlsabarbeitung irgendwo beschrieben ? Oder bin nur ich zu naiv davon ausgegangen, daß das Konstrukt eindeutig eine Berechnung und keine Verknüpfung darstellt?

Auch auf die Gefahr hin unhoeflich zu sein: Letzteres.

Sauberer ist es uebrigens, wenn Du es folgendermassen machst:
Zieltyp Zahl:
                         c = (parseInt(a, 10) * 100) + parseInt(b, 10);

Zieltyp String:
                         c = String((parseInt(a, 10) * 100) + parseInt(b, 10));

Das ist dann zwar laenger, aber hat auch keine unliebsamen Seiteneffekte, wie Du sie beschrieben hast.

Bis dann

Michael N.