JavaScript/Operatoren/Zuweisungsoperator

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Mit dem Zuweisungsoperator = können Sie einen Wert in einer Variablen speichern.

Beispiel

Deklaration und Zuweisung

let SinnDesLebens;

SinnDesLebens = 42;

In der ersten Anweisung wird mit dem Schlüsselwort let eine Variable SinnDesLebens deklariert. Die zweite Anweisung besteht aus einem Ausdruck, der mit dem =-Operator den Wert 42 in dieser Variablen speichert.

Da die Kombination von Deklaration und Zuweisung sehr häufig vorkommt, wird sie von den Deklarationsanweisungen var, let und const in Form der Initialisierung zusammengefasst:

Initialisierung
let SinnDesLebens = 42;

Die linke Seite

Auf der linken Seite des =-Operators kann außer einer einfachen Variablen auch eine Objekteigenschaft oder ein Array-Eintrag stehen. Es ist nicht erforderlich, dass diese Eigenschaft oder dieser Array-Index bereits belegt sind, sie werden bei Bedarf von JavaScript erzeugt.

Zuweisung an Eigenschaften und Arrays
let leben = { sinn: 0 },
    sense = [];
leben.sinn = 42;
sense[42] = "life";

Die rechte Seite

Auf der rechten Seite des Zuweisungsoperators kann ein beliebiger Ausdruck stehen. JavaScript wertet diesen Ausdruck aus, und der daraus entstehende Wert wird in den Speicherplatz kopiert, der von der linken Seite bezeichnet wird.

Beachten Sie, dass Arrays und Objekte hierbei eine Sonderrolle einnehmen. Die Verwaltung dieser Wertetypen erfolgt zweistufig:

  • Das eigentliche Array oder Objekt ist eine eigenständige Datenstruktur, die von JavaScript intern verwaltet wird
  • Im JavaScript-Programm wird auf diese Datenstruktur lediglich verwiesen. Variablen enthalten nur die Verweis-Information. Bei einer Zuweisung wird nur der Verweis kopiert - das Array oder Objekt selbst dagegen nicht.
Zuweisung eines Arrays
const array1 = [ 1, 2, 3, 4 ];
const array2 = array1;

array1[2] = 33;
console.log(array2[2]);      // 33

In der ersten Zeil wird mit Hilfe eines Arrayliterals ein Array mit 4 Einträgen erzeugt und in der const-Variablen array1 gespeichert. In der Zeile 2 wird die Variable array2 deklariert und mit array1 initialisiert. Dabei wird aber nur der Verweis auf das eigentliche Array übertragen, und beide Variablen zeigen nun auf den gleichen Speicherbereich.

Das sieht man in den beiden folgenden Zeilen. Zuerst wird auf Index 2 von array1 der Wert 33 geschrieben, und dann der Wert von Index 2 von array2 ausgegeben. Die Ausgabe ist 33, nicht 3.}}}}

Das Ergebnis

Der Zuweisungsoperator ist ein Operator und hat einen Wert. Das bedeutet: bei einer Zuweisung handelt es sich um einen Ausdruck, und dieser Ausdruck kann wie ein Wert verwendet werden. Der Wert des Zuweisungsoperators ist der Wert, der zugewiesen wurde.

Beispiel
let SinnDesLebens;
alert(SinnDesLebens = 42);
alert(SinnDesLebens);


Beide Male wird 42 ausgegeben.

Empfehlung: Vermeiden Sie es, den Wert eines Zuweisungsausdrucks weiterzuverwenden. Die Gefahr, die Zuweisung mit einem Vergleich (==-Operator) zu verwechseln, ist hoch, und die Zuweisung wird schnell übersehen.

Die Reihenfolge der Ausführung

Wenn JavaScript einen Zuweisungsoperator antrifft, wertet es zunächst die beiden Operanden aus, und zwar zuerst den linken, dann den rechten. Erst danach wird die eigentliche Zuweisung ausgeführt.

Das klingt banal, es erklärt aber, weshalb die Zuweisung rechtsassoziativ ist.

Mehrfachzuweisung
let a = 1, b = 2;
a = b = a+3;

In Zeile 2 wird zunächst der Teil links vom ersten = ausgewertet, das ist ein Verweis auf die Variable a. Es folgt der Teil rechts vom ersten =, das ist der Zuweisungsausdruck b = a+3. Für seine Auswertung enthält a noch den Wert 1 aus der Initialisierung, deshalb bekommt b den Wert 4 zugewiesen. Das Ergebnis des Teilausdrucks ist der zugewiesene Wert 4 und dieser wird nun in a gespeichert. wird in der zweiten Zeile zuerst die 3 an b zugewiesen, und dann das Ergebnis der Zuweisung an a. Beide Variablen bekommen also den Wert 3.

Alles klar? Dann schauen Sie sich dieses Programmstück an und überlegen Sie vor dem Weiterlesen, was es wohl ausgeben könnte. Bei dem %d in den console.log Aufrufen handelt es sich übrigens um einen Formatierungscode, er bewirkt, dass der zweite Parameter der log-Methode an dieser Stelle als Ganzzahl eingesetzt wird.

Zuweisungschaos mit Seiteneffekten
let arr = [1,2,3];
let value = 5;

function getArray(n) {
   console.log("Hier ist getArray(%d)", n);
   value = n;
   return arr;
}

function getValue(n) {
   console.log("Hier ist getValue(%d) = %d", n, value);
   return value;
}

getArray(11)[1] = getArray(12)[2] = getValue(13);
console.log(arr);

Die Funktion getArray tut drei Dinge. Sie protokolliert ihren Aufruf, speichert ihren Parameterwert in der Variablen value und gibt dann das Array zurück, das in der globalen Variablen arr gespeichert ist. Die Frage „Wer macht denn so einen Unsinn?“ ist angemessen, aber oft entstehen solche Konstrukte aus gut gemeinten Optimierungen von Abläufen. „Das kann man hier doch gleich mit erledigen...“, lautet oft die Begründung.

Die Funktion getValue gibt lediglich den Wert von value zurück und hat im Beispiel nur den Zweck, den Zugriff auf value zu protokollieren.

Die Anweisung getArray(11)[1] = getArray(12)[2] = getValue(1); wird von links nach rechts ausgewertet.

  1. getArray(11) wird aufgerufen. In diesem Aufruf wird value auf 11 gesetzt, dann wird arr zurückgegeben. Damit bildet JavaScript arr[1] als Ziel des linken Zuweisungsoperators
  2. getArray(12) wird aufgerufen. Diesmal wird value auf 12 gesetzt und arr wird erneut zurückgegeben. JavaScript bildet arr[2] als Ziel des rechten Zuweisungsoperators
  3. getValue(13) wird aufgerufen und gibt value zurück. Von der ursprünglichen 5 ist nur noch Bitstaub übrig. Die Funktion findet eine 12 und gibt sie zurück.
  4. die rechte Zuweisung wird ausgeführt, arr[2] wird auf 12 gesetzt.
  5. jetzt ist der rechte Operand der linken Zuweisung vollständig verarbeitet und die linke Zuweisung kann ausgeführt werden. Sie setzt arr[1] auf das Ergebnis der rechten Zuweisung, ebenfalls 12.

Die Ausgabe sollte in etwa so aussehen:

  Hier ist getArray(11)
  Hier ist getArray(12)
  Hier ist getValue(13) = 12
   (3) [1, 12, 12]

Richtig, Programmcode dieser Art ist nur für Quizaufgaben empfehlenswert.