Karl Heinz: Java Script Newbie Frage

Hallo,

ich habe eine Frage zu Java-Script.

Ich möchte anmerken, dass ich nicht programmiere, möchte den Hintergrund bezogen auf folgende Problematik aber trotzdem verstehen.

In einer Anleitung habe ich die folgenden beiden Beispiele gefunden:

Beispiel 1:

<script>
  dataLayer = [{
    'product_ids' : 'AA12345',
    'page_type' : 'product',
    'total_value' : 49950
  }]
</script>

Beispiel 2:

<script>
  window.dataLayer = window.dataLayer || []
  dataLayer.push({
   'product_ids' : 'AA12345',
   'page_type' : 'product',
   'total_value' : 49950
  });
</script>

Handelt es ich bei Beispiel 1 und bei Beispiel 2 um das gleiche?

Wann sollte man Beispiel 1 als Lösung wählen bzw. wann Lösung man Beispiel 2 als Lösung wählen

  1. In einer Anleitung habe ich die folgenden beiden Beispiele gefunden:

    https://www.simoahava.com/gtm-tips/datalayer-declaration-vs-push/ <= hier etwa?

    Da steht auch die Problembeschreibung zur Lösung. MfG

  2. Hallo,

    Handelt es ich bei Beispiel 1 und bei Beispiel 2 um das gleiche?

    Nein. Im ersten Fall hast du eine einfache Variable, deren Inhalt du mit einem Objekt beschreibst. Im zweiten Fall wird einem Array das Objekt angehängt.

    Wobei ich mich wundere, dass einmal Window.dataLayer und einmal nur dataLayer verwendet wird. Kann das jemand erklären?

    Gruß
    Kalk

    1. dataLayer = 1243;
      

      funktioniert im Strict-Mode nicht. Da müsste ein "var" davor stehen. Deswegen window.dataLayer, um eine eventuell schon existierende globale Variable zu referenzieren.

      Die Zuweisung an dataLayer im 2. Beispiel ist deswegen nicht gut bzw. funktioniert nicht im strict Mode.

      Rolf

  3. Es ist nicht das gleiche.

    Beispiel 1 überschreibt ein existierendes Array. Ich habe nachher immer genau einen Eintrag. Wenn das Script im strict-Mode läuft, gibt's eine Fehlermeldung. Man müsste ein "var" vor die Zuweisung schreiben. Allerdings muss man dann darauf achten, dass der Code auch im globalen Scope ausgeführt wird.

    Beispiel 2 ist ungenau - man sollte auch die Zuweisung mit "window." prefixen, damit der Code im strict Mode funktioniert. Es legt in der globalen Variable das Array bei Bedarf an und fügt dann einen Eintrag hinzu. D.h. wenn es im Beispiel 2 bereits mit N Einträgen existiert, hat man nachher N+1 Einträge.

    Nebenbei: Dass "window" das globale Objekt bezeichnet, ist eine Spezialität für JavaScript im Browser. Andere Systeme, wie z.B. node.js, können das globale Objekt unter anderem Namen bereitstellen.

    Rolf

  4. Tach!

    Beispiel 1:

    In dem wird ein Array mit einem Objekt als dem einzigen Element dieses Arrays erstellt.

    Beispiel 2:

    In dem wird zum vorhandenen Array ein Objekt als weiteres Element hinzugefügt. Das Array ist aber eventuell gar nicht vorhanden, weswegen es zuerst in der ersten Zeile sozusagen auf Existenz geprüft und bei Bedarf leer erstellt wird. Die Prüfung geht aber davon aus, dass da in der eventuell vorhandenen Variable auch ein Array drin ist. Wenn da nur eine Zahl oder ein String drin ist, gibt es in der Folge einen Fehler. Ob den Fall berücksichtigen muss oder ob er unwahrscheinlich ist, muss man an der konkreten Anwendung klären.

    Wann sollte man Beispiel 1 als Lösung wählen bzw. wann Lösung man Beispiel 2 als Lösung wählen

    Wenn das Array literal (also direkt im Quelltext) erstellt werden kann (auch wenn es nur die Erstinitialisierung ist) dann reicht Nummer 1. Die Push-Variante brauchst du, um weitere Element hinzuzufügen. Manchmal weiß man nicht, ob man der erste ist oder das Array schon existiert, dann kommt die Push-Variante mit der Vorspannzeile zum Einsatz.

    Ich denke, es ist aber generell besser, das Array definiert zu initialisieren, bevor man es befüllt oder befüllen lässt. Die Befüllstelle kann dann gleich und generell Variante 2 ohne Vorspannzeile ausführen.

    dedlfix.

    1. Tach!

      Ich denke, es ist aber generell besser, das Array definiert zu initialisieren, bevor man es befüllt oder befüllen lässt. Die Befüllstelle kann dann gleich und generell Variante 2 ohne Vorspannzeile ausführen.

      Das wäre dann auch eine Frage der Separation of Concerns (Trennung von Zuständigkeiten). Die Befüllstelle (in Form einer Funktion) bekommt das Array übergeben, das es befüllen soll und kümmert sich nicht selbst um dessen Erstellung. Die Existenz sicherzustellen ist Aufgabe des Aufrufers. Und damit kann man dann auch frei entscheiden, welches Array man da übergibt und ist nicht auf das eine globale fixiert.

      dedlfix.