Yadgar: Javascript: replace() funktioniert nicht

Hi(gh)!

Weil ich gerne eine interaktive grafische Übersicht über meine Förderanlagen, Produktionsmaschinen und Fließbänder in "Satisfactory" hätte (mit Excel/LibreOffice Calc-Tabellen kommt man da nicht weit), habe ich beschlossen, endlich mal Javascript zu lernen und mir WENZ, Christian: JavaScript - Grundlagen, Programmierung, Praxis (Galileo Press 2014) bestellt, das ich nun angefangen habe durchzuarbeiten.

Bis jetzt lief das alles prima, aber dann stoße ich auf Seite 66 auf das hier:

<!-- WENZ, Christian: JavaScript - Grundlagen, Programmierung, Praxis, 11. Auflage, S. 66 -->

<script>
  var Zk = "AXAYAZ"; //Zk steht für "Zeichenkette"
  Zk.replace("A", "B");
  document.write(Zk); // Ausgabe der Variable von mir hinzugefügt
</script>

Ich kann machen, was ich will, aber statt "BXBYBZ" kommt am Ende immer nur "AXAYAZ" raus, der String wird nicht verändert! Warum?

Bis bald im Khyberspace!

Yadgar

  1. printf('Hallo %s!', ['Du', 'ihr', 'Welt', 'zusammen'][rand(0, 3)]);

      var Zk = "AXAYAZ"; //Zk steht für "Zeichenkette"
      Zk.replace("A", "B");
      document.write(Zk); // Ausgabe der Variable von mir hinzugefügt
    </script>~~~
    

    Ich kann machen, was ich will, aber statt "BXBYBZ" kommt am Ende immer nur "AXAYAZ" raus, der String wird nicht verändert! Warum?

    Vielleicht solltest du das Ergebnis von replace() auch zuweisen und nicht direkt wieder verwerfen?

    /K

    --
    Klingonen sind doof. Sie rufen ständig nach einem Kaplan und wollen nach dem Tod in Styropor® sein.
    1. @@kai345

      Vielleicht solltest du das Ergebnis von replace() auch zuweisen und nicht direkt wieder verwerfen?

      Im MDN steht das auch unmissverständlich da: “The replace() method returns a new string […] The original string is left unchanged.”

      Unpopuläre Meinung: MDN ist das bessere Nachschlagewerk für sowas.


      Klingonen sind doof. Sie rufen ständig nach einem Kaplan und wollen nach dem Tod in Styropor® sein.

      yIDoghQo’ 😂

      😷 LLAP

      --
      „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
      — Joachim Gauck über Impfgegner
  2. Lieber Yadgar,

    endlich mal Javascript zu lernen und mir WENZ, Christian: JavaScript - Grundlagen, Programmierung, Praxis (Galileo Press 2014) bestellt,

    wir haben da auch was im Wiki. Ist das zum Lernen von JavaScript nicht gut genug? Wenn nicht, was findest Du im Wiki, das zum Lernen hinderlich ist und was Dein Buch besser macht?

      var Zk = "AXAYAZ"; //Zk steht für "Zeichenkette"
      Zk.replace("A", "B");
    

    Warum genau var? Kann es sein, dass die 11. Auflage inhaltlich auf dem Stand von vor 11 Jahren ist? Inzwischen haben wir in JavaScript mehr als das, weil das für die Art der Verwendung von Variablen wirklich wesentlich ist.

    Und wenn Du bei uns unter String nachschaust, dann steht da (jetzt neu), dass Strings prinzipiell unveränderlich sind.

    Liebe Grüße

    Felix Riesterer

    1. Hi(gh)!

      Warum genau var? Kann es sein, dass die 11. Auflage inhaltlich auf dem Stand von vor 11 Jahren ist?

      Nein, auf dem Stand von 2014, also nicht ganz so alt...

      Inzwischen haben wir in JavaScript mehr als das, weil das für die Art der Verwendung von Variablen wirklich wesentlich ist.

      Und wenn Du bei uns unter String nachschaust, dann steht da (jetzt neu), dass Strings prinzipiell unveränderlich sind.

      Tja, ich bin leider zu arm für aktuelle Lehrbücher, ich muss mich damit begnügen, was gerade in der "Bucht" rumschwappt…

      Bis bald im Khyberspace!

      Yadgar

      1. Servus!

        Hi(gh)!

        Warum genau var? Kann es sein, dass die 11. Auflage inhaltlich auf dem Stand von vor 11 Jahren ist?

        Nein, auf dem Stand von 2014, also nicht ganz so alt...

        @Felix Riesterer fragte dies, weil 2015 die sechste Version von ECMAScript (ES6) veröffentlicht wurde, die mittlerweile von allen modernen Browsern unterstützt wird. Es war seit der Veröffentlichung von ES5 im Jahre 2009 die erste grundlegende Überarbeitung von JavaScript.

        Inzwischen haben wir in JavaScript mehr als das, weil das für die Art der Verwendung von Variablen wirklich wesentlich ist.

        var ist mittlerweile durch let(was man hier verwenden würde) und const ergänzt worden.

        Und wenn Du bei uns unter String nachschaust, dann steht da (jetzt neu), dass Strings prinzipiell unveränderlich sind.

        @MudGuard erwähnte ebenfalls, dass document.writeheute auch verpönt ist. Die Konsole, oder Dev Tools, die du mit [F12] öffnest, hilft Dir beim Entwickeln tausendfach, weil du alles untersuchen kannst. Je eher du dich damit beschäftigst …

        Tja, ich bin leider zu arm für aktuelle Lehrbücher, ich muss mich damit begnügen, was gerade in der "Bucht" rumschwappt…

        Würde ich bei Bellestristik und Geschichte auch machen -

        bei JavaScript würde ich unsere kostenlosen und aktuellen Selbstlern-Tutorials durcharbeiten:

        Herzliche Grüße

        Matthias Scharwies

        --
        Einfach mal was von der ToDo-Liste auf die Was-Solls-Liste setzen.“
      2. Hallo Yadgar,

        der "Wenz" ist uralt und immer wieder überarbeitet worden. Wenn man nach dem Buch sucht, findet man noch Ausgaben von 2000 (die viel dicker sind und den Eindruck erwecken, da stünde mehr drin) - deine Auflage hat 542 Seiten, wenn ich das richtig sehe, und sie wird damit angepriesen, dass der Autor durchgeputzt hätte und Ballast über Bord geworfen hätte.

        Ich frage mich allerdings, wie man den angegebenen Inhalt auf nur 542 Seiten so darstellen will, dass dabei etwas sinnvolles rumkommt.

        Und wenn das von Dir gezeigte Beispiel so im Buch steht, ist es ein Fall für die Errata. Ich habe bei Amazon Kommentare zum Buch gefunden, dass es voller Fehler sei und eine Abschlusskontrolle vermissen lasse. Es findet sich ein Hinweis, dass hauser-wenz.de Errata für dieses Buch anböte, aber leider meldet sich diese Seite als Dauerbaustelle. Du musst also bei allem, was Dir im Buch merkwürdig vorkommt, immer fragen: Ist das jetzt meine Dusseligkeit, oder wieder mal ein Druckfehler?

        Das konkrete Problem wurde Dir genannt: Das Ergebnis einer Stringfunktion musst Du wieder zuweisen, weil die Stringfunktionen den String, auf dem sie angewendet werden nicht verändern. Das ist ein Grundkonzept in vielen Sprachen, das die Handhabung von Strings in der JavaScript-Engine vereinfacht und Problemsitiuationen für den Programmierer umgeht, die bei veränderlichen Strings entstehen können.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hi(gh)!

          Vernünftige (und dabei bezahlbare!) Literatur zu Programmiersprachen scheint wirklich reine Glückssache zu sein - vor zwei Jahren war ich bei C in einer vergleichbaren Situation und quälte mich mit einem 20 Jahre alten Lehrbuch rum, das nach einhelliger Meinung auf www.cplusplus.de reiner Schund war... und dort erzählte man mir auch, dass dies für deutschsprachige Computerliteratur typisch sei - als würde man uns "Bimbos" im IT-Drittweltland Däutschland (kein Tippfehler!) halt mit minderwertigem Schrott abspeisen!

          Bis bald im Khyberspace!

          Yadgar

          1. Hi(gh)!

            Und der Frust mit dem "Wenz" nimmt kein Ende: auf Seite 74 wird das Funktionen-Unterobjekt "arguments" (in C++ würde man das wohl "Membervariable" nennen) mit folgendem kleinen Listing vorgestellt:

              function tag()
              {
                var returnstring = "";
                for (var i = 0; i<tag.arguments.length; i++)
                  returnstring += "<" + tag.arguments[i] + ">";
                  
                return returnstring;  
              }
            

            Darunter steht dann noch ein Beispiel-Aufruf:

            tag("p id='p1'", "span style='color: black;'", "b")

            Prima, dachte ich mir, dann kann ich ja mit

            document.write(tag("p id='p1'", "span style='color: black;'", "b"));

            testen, ob tag.arguments so funktioniert wie beschrieben.

            Es funktioniert leider nicht - mir wird nur > angezeigt! Die Fehlerkonsole schmeißt folgende Meldung:

            "Mit document.write() wurde ein nicht balancierter Baum geschrieben, was dazu geführt hat, dass Daten aus dem Netzwerk neu geparst werden mussten. Für weitere Informationen https://developer.mozilla.org/en/Optimizing_Your_Pages_for_Speculative_Parsing"

            Nicht balancierter Baum? Netzwerk? Spekulatives Parsing? Ich verstehe nur Bahnhof...

            ...und der Link in der Meldung taugt auch nichts, ich bekomme nur "Page not found". Toll!

            Ich bin kurz davor, das Buch größtenteils ungelesen ins Altpapier zu donnern... und für so einen Mist gebe ich Geld aus!!!

            Bis bald im Khyberspace!

            Yadgar

            1. Servus!

              Und der Frust mit dem "Wenz" nimmt kein Ende: auf Seite 74 wird das Funktionen-Unterobjekt "arguments" (in C++ würde man das wohl "Membervariable" nennen) mit folgendem kleinen Listing vorgestellt:

                function tag()
                {
                  var returnstring = "";
                  for (var i = 0; i<tag.arguments.length; i++)
                    returnstring += "<" + tag.arguments[i] + ">";
                    
                  return returnstring;  
                }
              

              @Rolf B hat Di schon vorgeschlagen, die Schuld nicht bei Dir sondern beim Wenz zu suchen:

              Das ist seit ES3 (also noch vor ES6 (2015) obsolet geworden.

              Es funktioniert leider nicht - mir wird nur > angezeigt! Die Fehlerkonsole schmeißt folgende Meldung:

              "Mit document.write() wurde ein nicht balancierter Baum geschrieben, was dazu geführt hat, dass Daten aus dem Netzwerk neu geparst werden mussten. Für weitere Informationen https://developer.mozilla.org/en/Optimizing_Your_Pages_for_Speculative_Parsing"

              Nicht balancierter Baum? Netzwerk? Spekulatives Parsing? Ich verstehe nur Bahnhof...

              ...und der Link in der Meldung taugt auch nichts, ich bekomme nur "Page not found". Toll!

              Ich bin kurz davor, das Buch größtenteils ungelesen ins Altpapier zu donnern... und für so einen Mist gebe ich Geld aus!!!

              Geh zum nächsten Beispiel und mach da weiter oder arbeite eben eins unserer Tutorials durch!

              Bis bald im Khyberspace!

              Yadgar

              Herzliche Grüße

              Matthias Scharwies

              --
              Einfach mal was von der ToDo-Liste auf die Was-Solls-Liste setzen.“
            2. Hallo,

              Nicht balancierter Baum? Netzwerk? Spekulatives Parsing? Ich verstehe nur Bahnhof...

              ...und der Link in der Meldung taugt auch nichts, ich bekomme nur "Page not found". Toll!

              Das hier vielleicht?: /Glossary/speculative_parsing

              Gruß
              Kalk

            3. Hallo Yadgar,

              die gezeigte tag-Funktion tut, was sie mutmaßlich soll: jedes ihrer Argumente in < und > einschließen und das Ergebnis als langen String zurückgeben. Ob eine Funktion sinnvoll ist, sei dahingestellt. Um Stringverarbeitung und den Gebrauch von arguments vorzuführen, kann man sie nehmen.

              Du musst allerdings aufpassen. arguments verhält sich unterschiedlich, je nach dem, ob Du im strict mode bist oder nicht. Und eigentlich ist es veraltet (wenn auch nicht missbilligt), man sollte statt dessen einen Restparameter verwenden. Die einzige Existenzberechtigung für arguments ist JavaScript, das auch im Internet Explorer funktionieren soll, denn der kennt keine Restparameter.

              Und woher kommen deine Probleme?

              Alle 3 Tags sind solche, die geschlossen werden müssen. Wenn Du die Schließ-Gegenstücke nicht sendest (bspw. mit tag("/b", "/span", "/p") - wobei das natürlich auf der Seite Sinn ergeben muss), dann entsteht ein DOM, in dem Elemente offen bleiben.

              Speculative Parsing ist - wie Mozilla schreibt, wenn man die Seite findet - ein Feature, um den HTML Parser weiterlaufen zu lassen, während ein Script geladen und ausgeführt wird. Es funktioniert aber nur, wenn in diesem Script das HTML Datenmodell (das DOM) nicht signifikant verändert wird. Signifikant bedeutet: Die Grundstruktur muss erhalten bleiben. HTML Text, der vom Script mit document.write erzeugt wird, darf keinen Einfluss auf den HTML Text nach dem Script haben. Denn andernfalls ist die spekulative Parserei für den Eimer.

              Genau das passiert aber, wenn Du HTML Tags öffnest und nicht schließt. Die HTML Elemente, die vom spekulativ verarbeiteten HTML erzeugt wurden, haben dann auf einmal einen anderen Kontext. Und genau das sagt Dir der Browser. Leider ist der Link Müll - ob das an Firefox oder an der Mozilla-Webseite liegt, kann ich Dir nicht sagen, aber der Wenz ist daran nicht Schuld.

              Dass ein unbalancierter Baum entsteht, ist ebenfalls nicht die Schuld des Wenz, sondern die Folge deines Gebrauchs der tag-Funktion. Du öffnest Elemente, ohne sie zu schließen. Die Baumstruktur des DOM-Abschnitts, den Du mit document.write schreibst, ist damit nicht im Gleichgewicht. Und der spekulativ erstellte Teil des DOM hinter deinem Script kippt damit um.

              Es gibt gute Gründe, weshalb von document.write abgeraten wird. Einen davon hast Du vorgeführt.

              Rolf

              --
              sumpsi - posui - obstruxi
              1. Hi(gh)!

                O.k., Lektion verstanden... im nächsten Kapitel kann ich allerdings nahtlos weiterfrusten: lang und breit werden einem date() und seine Methoden erklärt - nur kennt das heutige Javascript anscheinend date() nicht mehr, jedenfalls bekomme ich immer auf

                var d = new date();

                nur die Meldung "date is not defined"! Ich glaube, ich entsorge den "Wenz" wirklich im blauen Container, diesen Murks mag ich mir nicht länger antun! Wegwerf-Wissen! Eine Beleidigung für mein Gehirn...

                (ich möchte nicht wissen, wie es mit den beiden SVG-Lehrbüchern wird, die ich mir ebenfalls bestellt habe...)

                Bis bald im Khyberspace!

                Yadgar

                1. printf('Hallo %s!', ['Du', 'ihr', 'Welt', 'zusammen'][rand(0, 3)]);

                  D != d

                  javascript nimmt's hier sehr genau mit der Schreibweise.

                  /K

                  --
                  Klingonen sind doof. Sie rufen ständig nach einem Kaplan und wollen nach dem Tod in Styropor® sein.
                2. Lieber Yadgar,

                  wer heute noch über Computertechnologien aus Büchern lernen will, lernt das Wesentliche überhaupt nicht mehr: Diese Dinge verändern sich in einem so rasanten Tempo, dass man aus online-Quellen lernen muss, weil Bücher mit der Aktualität der Dinge schlicht nicht mithalten können. Aus genau diesem Grund habe ich vor Jahren schon aufgegeben, Zeitschriften zu einem solcher Themen zu kaufen.

                  Liebe Grüße

                  Felix Riesterer

                  1. Hallo Felix,

                    weil Bücher mit der Aktualität der Dinge schlicht nicht mithalten können

                    Einerseits zieht Selfhtml daraus eine Existenzberechtigung.

                    Eine. Nicht die.

                    Andererseits kann ich in meinem Alter zu dieser Entwicklung meinen Beifall nicht geben. Es ist nicht produktiv, wenn die Sauen so dicht durch's Dorf getrieben werden, dass die eine der anderen in's Ringelschwänzchen beißt.

                    Die Basis von JavaScript betrifft das aber nicht. Die ist hinreichend stabil für ein Buch.

                    Und so ist drittens das Unvermögen, date von Date zu unterscheiden, nicht unbedingt dem Buch anzulasten. Vielleicht doch, ich weiß nicht, wie deutlich es auf die case sensitivity in JavaScript hinweist.

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                  2. Lieber Yadgar,

                    wer heute noch über Computertechnologien aus Büchern lernen will, lernt das Wesentliche überhaupt nicht mehr: Diese Dinge verändern sich in einem so rasanten Tempo, dass man aus online-Quellen lernen muss, weil Bücher mit der Aktualität der Dinge schlicht nicht mithalten können. Aus genau diesem Grund habe ich vor Jahren schon aufgegeben, Zeitschriften zu einem solcher Themen zu kaufen.

                    ...und die meisten dieser Online-Quellen sind didaktisch eine Katastrophe, verschwinden ständig, tauchen anderswo neu auf, die Struktur wird alle Nasenlang umgestellt, und nein, Google ist nicht mein Freund!

                    Ich schließe daraus: mit diesem "rasanten Tempo" kann ich einfach nicht mehr mithalten, die moderne IT-Welt ist nichts für mich! Mir bleibt nichts anderes übrig, als mich auf Retrocomputing zu verlegen, da ändert sich nichts, Commodore BASIC V2.0 ist auch 2021 noch Commodore BASIC V2.0... oder mir überhaupt schonmal Gedanken über ein Leben ganz ohne Computer zu machen!

                    Bis bald im... Khyberspace? Nö, im echten Afghanistan natürlich! Da kommt man nämlich auch ohne Programmieren hin, man braucht nur ein zuverlässiges Fahrrad...

                    Yadgar

                    1. Lieber Yadgar,

                      ...und die meisten dieser Online-Quellen sind didaktisch eine Katastrophe, verschwinden ständig, tauchen anderswo neu auf, die Struktur wird alle Nasenlang umgestellt, und nein, Google ist nicht mein Freund!

                      Wir haben dir mehrfach SELFHTML angeboten, das es seit 1995 gibt und hoffentlich noch lange geben wird.

                      Schau halt mal rein und sag dann, dass es didaktisch eine Katastrophe ist.

                      Bis bald im... Khyberspace? Nö, im echten Afghanistan natürlich! Da kommt man nämlich auch ohne Programmieren hin, man braucht nur ein zuverlässiges Fahrrad...

                      Nach Asien ohne den Iran?(rad-forum.de)

                      Iran ist dicht, Turkmenistan auch.

                      Bist du ein Troll?

                      Herzliche Grüße

                      Matthias Scharwies

                      --
                      Einfach mal was von der ToDo-Liste auf die Was-Solls-Liste setzen.“
                      1. Hi(gh)!

                        Lieber Yadgar,

                        Wir haben dir mehrfach SELFHTML angeboten, das es seit 1995 gibt und hoffentlich noch lange geben wird.

                        Schau halt mal rein und sag dann, dass es didaktisch eine Katastrophe ist.

                        Bis bald im... Khyberspace? Nö, im echten Afghanistan natürlich! Da kommt man nämlich auch ohne Programmieren hin, man braucht nur ein zuverlässiges Fahrrad...

                        Nach Asien ohne den Iran?(rad-forum.de)

                        Iran ist dicht, Turkmenistan auch.

                        Das mit Iran wusste ich nicht - und Turkmenistan ist für Langhaarige sowieso No-Go-Area!

                        Bist du ein Troll?

                        Nein, die Trollerei überlasse ich meinen Krawallsatire-Sockenpuppen "Neoliberaler Ellenbogenkrieger", "Nazitroll mit Jagdschein" und "joe flametti"!

                        Zurück zum Thema: heute ist es mit der Post gekommen, Alexander ADAM: SVG Scalable Vector Graphics - das Praxisbuch, von 2002... und ich sehe schon, dass ich es ungelesen ins Altpapier werde pfeffern müssen! Schöne Scheiße... fünf Euro habe ich dafür ausgegeben! Eigentlich sollte man mich wegen Verschwendungssucht entmündigen lassen...

                        Bis bald im Khyberspace!

                        Yadgar

                        1. Lieber Yadgar,

                          Eigentlich sollte man mich wegen Verschwendungssucht entmündigen lassen...

                          es freut mich, dass Du jetzt kritischer auf die Dinge schaust. Und wenn Du schon als Lernender Futter suchst, dann kannst Du ja rückmelden, wenn Du in unserem Wiki Verständnis-Stolpersteinen begegnest. Dann wird unsere Doku dadurch besser, dass sie jemand gezielt zum Lernen verwendet.

                          Für jemanden in meiner Position ist sie eher ein Nachschlagewerk, das ich mit vorher bekannten Suchbegriffen über die Suchfunktion nutze. Daher bin ich zu weit weg von Deiner Perspektive um Stolpersteine für das Verständnis bei Lernenden wie Dir im Vorfeld sicher zu erkennen. Das ist der Grund, warum ich Dich ermutigen möchte, unsere Doku intensiv zu nutzen und rückzumelden, wenn Dir etwas auffällt, das Dein Lernen bremst.

                          Liebe Grüße

                          Felix Riesterer

                        2. Hallo

                          heute ist es mit der Post gekommen, Alexander ADAM: SVG Scalable Vector Graphics - das Praxisbuch, von 2002... und ich sehe schon, dass ich es ungelesen ins Altpapier werde pfeffern müssen! Schöne Scheiße...

                          Hast du vorher gewusst, dass das Buch aus dem Jahr 2002 stammt? Das sind in der EDV praktisch <blitz /><donnergrollen /><stimme style="schwere: bedeutungsschwanger">Äonen</stimme>.

                          Auch wenn, wie du selber sagst, du nur gelegentlich als Gelegenheitshobby programmierst, solltest du das wissen.

                          [edit]
                          Mist, falscher Knopf. Wenn diese Information nicht verfügbar war, war das allerdings ein mindestens fragwürdiges Angebot. Ich frage mich gerade, ob sich das hätte recherchieren lassen.
                          [/edit]

                          Tschö, Auge

                          --
                          200 ist das neue 35.
  3. Hi,

      var Zk = "AXAYAZ"; //Zk steht für "Zeichenkette"
    

    hm. Wenn der Name der Variable erst noch erklärt werden muß, ist was schiefgegangen …

      document.write(Zk); // Ausgabe der Variable von mir hinzugefügt
    

    document.write sollte man dafür nicht nehmen, eher console.log.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo MudGuard,

      das kann man nicht vergleichen. document.write schreibt ins HTML Dokument (für den User), console.log in die Entwicklerkonsole (für den Programmierer).

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hi,

        das kann man nicht vergleichen. document.write schreibt ins HTML Dokument (für den User), console.log in die Entwicklerkonsole (für den Programmierer).

        Ja, aber Debug-Ausgaben sollte man nicht ins Dokument schreiben. (und wenn man das nach dem ersten Anzeigen der Seite macht, schreibt's das ja nicht ins Dokument, sondern ersetzt das Dokument.

        cu,
        Andreas a/k/a MudGuard

        1. Hallo MudGuard,

          Ja, aber Debug-Ausgaben sollte man nicht ins Dokument schreiben.

          stimmt, da steht ja "Ausgabe von mir hinzugefügt" dabei. Also ja, in dem Fall: console.log.

          Rolf

          --
          sumpsi - posui - obstruxi