AndreasVogt: javascript addition

Hallo, ich will per javascript Zahlen mit String addieren wie folgt:

var startNum = 1;
var str1 = startNum  + ',' + startNum + 1 + ',' + startNum + 2 + ',';
alert(str1);

Eigentlich sollte der String "1,2,3," herauskommen. habe schon versucht startNum mit parseInt() zu konvertieren, ohne Erfolg. Dann habe ich startNum mit 1 multipliziert (hab ich wo gelesen), ohne Erfolg. Ergebnis ist "1,11,12,"

Was mach ich falsch? Gruß Andreas

  1. Hallo,

    der +-Operator ist in JS sowohl für Addition von Zahlen als auch für das Verketten von Strings zuständig. Wenn du nur Zahlen hast wird addiert. Sobald ein String mitmacht wird verkettet.

    Gruß
    Kalk

  2. Hallo Andreas,

    setz mal die Rechenoperationen in Klammern.

    Gruß
    Jürgen

  3. Hey,

    Witzig das, dass funktioniert.

    Gruß
    Jo

    1. Hallo,

      ich freue mich über deinen Humor, aber das funktioniert deshalb, weil ++ kein Stringoperator ist.

      Gruß
      Jürgen

      1. Hey,

        ich freue mich über deinen Humor, aber das funktioniert deshalb, weil ++ kein Stringoperator ist.

        Ich weiß, hätte aber nicht gedacht das, dies so auseinander gehalten wird.

        Gruß
        Jo

        1. ich freue mich über deinen Humor, aber das funktioniert deshalb, weil ++ kein Stringoperator ist.

          Ich weiß, hätte aber nicht gedacht das, dies so auseinander gehalten wird.

          Die Erklärung ist auch nicht ganz korrekt. Die richtige Begründung ist, dass der ++-Postfix-Operator eine höhere Präzedenz (17) als der binäre +-Operator (13) hat. Damit (und weil + links-assoziativ ist) ist dem Parser klar, dass der Term die folgende syntaktische Struktur haben muss:

          ((((((startNum++) + ',') + (startNum++)) + ',') + (startNum++)) + ',')

          1. Hey,

            Die Erklärung ist auch nicht ganz korrekt. Die richtige Begründung ist, dass der ++-Postfix-Operator eine höhere Präzedenz (17) als der binäre +-Operator (13) hat. Damit (und weil + links-assoziativ ist) ist dem Parser klar, dass der Term die folgende syntaktische Struktur haben muss:

            ((((((startNum++) + ',') + (startNum++)) + ',') + (startNum++)) + ',')

            Starke Erklärung, danke!

            Gruß
            Jo

    2. Aloha ;)

      Witzig das, dass funktioniert.

      Hast du deinen Satzbau Bäumchen-Wechsel-dich spielen lassen? 😉

      *scnr*

      Grüße,

      RIDER

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
      # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
  4. Der Plus-Operator ist in JavaScript überladen. Er dient zur Addition von Float-Zahlen und zum Verbinden von Zeichenketten. Und weil das noch nicht Verwirrung genug ist, nimmt sich JavaScript auch noch die Freiheit die Typen der Argumente anzupassen, wenn sie nicht übereinstimmen. Was nicht passt, wird passend gemacht. Die Regeln, nach denen das funktioniert, kann sich kein Mensch merken. Ich würde die Verkettung und die Addition nicht miteinander in einem Term vermischen, sondern die Verkettung durch Template-Literale ersetzen. Das macht den Code auch gleich besser lesbar:

    var startNum = 1;
    var str1 = `${startNum}, ${startNum + 1}, ${startNum + 2},`;
    
    1. 
      var str1 = `${startNum}, ${startNum + 1}, ${startNum + 2},`;
      
      

      Nur zur Ergänzung: Das ist ES6 und funktioniert im IE und Safari laut MDN nicht.

      1. Wollte gerade schon hektisch zur Spec rennen, das hab ich bisher in JS noch nicht gesehen.

        Danke für den Versionshinweis.

        Rolf

        1. Mangelnder Browser-Support muss heute kein Grund mehr sein, um auf den Einsatz von neuen JavaScript-Features zu verzichten. Man kann relativ mühelos EcmaScript 2015 Code schreiben und ihn in ES5.1 oder noch ältere Versionen übersetzen lassen, zum Beispiel mit babel oder TypeScript. Die modernen Dialekte bieten natürlich viel mehr als nur Template-Literale, ich würde heute eine Fülle an Features vermissen, wenn ich dazu verdammt wäre in einer älteren Version zu programmieren.

          1. Und mangelnde Dokumentation in SelfHTML muss kein Grund zur Unwissenheit sein - ich hab mal was dazu verfasst und bitte um konstruktive Kritik :)

            Rolf

    2. Danke an alle für die Hilfe, funktioniert jetzt.

      Gruß Andreas