molily: Objekte versus Primitives, Referenzen und Kopien, Identität

Beitrag lesen

Hallo,

In Javascript ist _alles_ ein Objekt. Es gibt nur Objekte. Keine Primitives (oder sonstige Halblebigkeiten).

Nein! Natürlich gibt es Primitives in JavaScript (ECMAScript). Wenn ich Number-, String- oder Boolean-Literale notiere, erzeuge ich Primitives. Die werden allerdings (nur für den Kontext der jeweiligen Expression) automatisch in Objekte umgewandelt, sofern es der Kontext erfordert.

Also, nicht alle Variablen sind Objekte. Die Unterscheidung zwischen Objekten und Primitives in JavaScript ist sogar sehr wichtig:

  • Objekte haben eine »eigene Identität«, sie sind nur mit sich selbst identisch (Identitätsoperator ===) und auch nur mit sich selbst gleich (Vergleichsoperator ==).
  • Primitives haben keine »eigene Identität«, sie sind mit anderen Primitives gleichen Wertes gleich (==) und bei gleichem (Primitive-)Typ auch identisch (===).

(Wenn ich das jetzt richtig in Erinnerung habe.)

Aus der »Identität« folgt:

  • Objekte werden immer referenziert. (Beim Speichern eines Objektes wird nur der Zeiger auf eine Speicherstelle unter einem Namen abgelegt. Speichert man das Objekt unter einem anderen Namen, zeigen beide Namen auf dieselbe Speicherstelle.)
  • Primitives werden immer kopiert.

Was dein Beispiel angeht, so lässt sich das auch zeigen:

var obj = new Object();  
obj.info = function(){ alert( this.variable ); };  
obj.variable = "hallo welt";

obj.variable ist hier ein Primitive, kein Objekt:

var neueVar = obj.variable;  
neueVar = "neuer Wert";  
obj.info(); // bleibt »hallo welt«

Bei der Zuweisung wurde hier also kopiert, nicht referenziert. Denn ein String-Literal erzeugt immer ein Primitive. String-Objekte kann man hingegen z.B. so erzeugen: new String("bla"). Wenn man die kopieren will, wird eine Referenz angelegt.

Mathias