Kess: zur Info: (1* 100) + 22 = 10022

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

Beispiel:
a = '1'
b = '22'

Man beachte, daß beide Variablen Strings enthalten.

Für c = (a*100) + b errechnet der Browser entsprechend zunächst die Zahl 100 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'.
Für den Programmablauf ist das allerdings tödlich. Erst c = (a*100) + (b*1) liefert 122 zurück.

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

Gruß
Kess

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

  2. Hi Kess
    Ich weiss ja nicht, ob du die Variablen als strings definieren musst. Wenn nicht, dann definiere einfach ohne Anfuehrungszeichen:
    a = 1;
    b = 22;
    c= a*100+b;
    alert(c);
    Holger

    1. Hallo Holger

      Ich weiss ja nicht, ob du die Variablen als strings definieren musst. Wenn nicht, dann definiere einfach ohne Anfuehrungszeichen:

      Das war nur hier für die Demonstration.
      In meinem Script durchlaufen die Variablen mehrere Funktionen, stammen aus dem Tagestdatum, werden zu Zahlen konvertiert und an einer Stelle auch als String verwendet.

      Gruß
      Kess

  3. Moin Kess,

    a = '1'
    b = '22'

    Man beachte, daß beide Variablen Strings enthalten.

    Für c = (a*100) + b errechnet der Browser entsprechend zunächst die Zahl 100 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'.

    über das Problem bin ich auch schon des öfteren gestolpert. Ich hatte sogar mal den Fall, daß ich eine Ziffer aus einer Zeichenkette (Stringvariable) einer Zelle eines Arrays zuweisen wollte, welches numerisch war, was zum fast-Absturz des Browsers führte. Erst die Verwendung von parseInt(...) führte zum gewünschten Ergebnis...

    In Deinem Falle kannst Du zwecks Kürze auch mal

    c = (a*100) -- b;

    versuchen, den '-'-Operator gibt es für Strings nämlich nicht, und da bleibt der JavaScript-Engine gar nix anderes übrig, als auf numerische Behandlung umzuschalten ;-)

    Bis dannundwann...

    Andreas

    1. Whow, simpel und funktioniert. Merci. Kess