ECMAScript-Variablen enthalten Werte von zwei verschiedenen Datentypen: Basistypwerte und Referenztypwerte. Primitive Typwerte sind einfache Datenelemente, während Referenztypwerte Objekte sind, die aus mehreren Werten bestehen können.
Beim Zuweisen eines Werts zu einer Variablen muss der Parser feststellen, ob der Wert ein primitiver Typ oder ein Referenztyp ist. Zu den Grundtypen gehören „Undefiniert“, „Null“, „Boolesch“, „Zahl“ und „String“. Auf diese fünf Grunddatentypen wird über den Wert zugegriffen, sodass der tatsächliche Wert, der in der Variablen gespeichert ist, im Speicher gespeichert werden kann. Im Gegensatz zu anderen Sprachen erlaubt JavaScript keinen direkten Zugriff auf Speicherorte, was bedeutet, dass der Speicherplatz eines Objekts nicht direkt manipuliert werden kann. Wenn Sie ein Objekt bearbeiten, bearbeiten Sie tatsächlich eine Referenz auf das Objekt und nicht das eigentliche Objekt, sodass auf den Wert eines Referenztyps per Referenz zugegriffen wird.
1. Dynamische Attribute
Die Methoden zum Definieren von Basistypen und Referenztypen sind sehr ähnlich. Für Referenztypwerte können wir ihnen Eigenschaften und Methoden hinzufügen und ihre Eigenschaften und Methoden auch wie folgt ändern und löschen:
2. Variablenwert kopieren
Wenn Sie einen Wert eines Basistyps von einer Variablen in eine andere kopieren, wird ein neuer Wert auf dem Variablenobjekt erstellt und dann an den für die neue Variable zugewiesenen Speicherort kopiert.
Wenn ein Referenztypwert von einer Variablen in eine andere kopiert wird, wird auch eine Kopie des im Variablenobjekt gespeicherten Werts in den für die neue Variable zugewiesenen Speicherplatz kopiert. Der Unterschied besteht darin, dass dieser Wert tatsächlich ein Zeiger auf ein im Heap gespeichertes Objekt ist. Nach Abschluss des Kopiervorgangs verweisen beide Variablen tatsächlich auf dasselbe Objekt. Daher wirkt sich die Änderung einer der Variablen auf die andere Variable aus, wie unten gezeigt:
3. Parameter übergeben
Die Parameter aller Funktionen in ESMAScript werden als Wert übergeben. Mit anderen Worten: Das Kopieren des Werts außerhalb der Funktion in den Parameter innerhalb der Funktion ist dasselbe wie das Kopieren des Werts von einer Variablen in eine andere. Primitive Typwerte werden genauso übergeben wie primitive Typvariablen kopiert werden. Die Übertragung von Referenztypwerten erfolgt auf die gleiche Weise wie das Kopieren von Referenztypvariablen. Viele Entwickler sind an dieser Stelle möglicherweise verwirrt, da es zwei Möglichkeiten gibt, auf Variablen zuzugreifen: über den Wert und über die Referenz, während Parameter nur über den Wert übergeben werden können.
Beim Übergeben eines Basistypwerts an einen Parameter wird der übergebene Wert in eine lokale Variable (benannter Parameter) kopiert. Wie im folgenden Code gezeigt:
Bei der Übergabe eines Referenztypwerts an einen Parameter wird die Adresse des Werts im Speicher in eine lokale Variable kopiert, sodass Änderungen in dieser lokalen Variablen außerhalb der Funktion widergespiegelt werden. Hier verwenden wir Referenztypen, um einen Blick darauf zu werfen:
Innerhalb dieser Funktion beziehen sich obj und person auf dasselbe Objekt. Mit anderen Worten: Auch wenn das Objekt als Wert übergeben wird, greift obj per Referenz auf dasselbe Objekt zu. Wenn daher das Namensattribut zu obj innerhalb der Funktion hinzugefügt wird, wird auch die Person außerhalb der Funktion reflektiert, da es im Heapspeicher nur ein Objekt gibt, auf das die Person zeigt, und es sich um ein globales Objekt handelt. Viele Entwickler glauben fälschlicherweise, dass im lokalen Bereich geänderte Objekte im globalen Bereich widergespiegelt werden, was bedeutet, dass Parameter als Referenz übergeben werden. Um zu beweisen, dass Objekte als Wert übergeben werden, schauen wir uns das folgende modifizierte Beispiel an:
Wie aus dem obigen Beispiel ersichtlich ist, wird die Person automatisch so geändert, dass sie auf ein neues Objekt verweist, dessen Namensattributwert „sdf“ ist, wenn „person“ als Referenz übergeben wird. Beim nächsten Zugriff auf person.name wird jedoch immer noch „zxj“ angezeigt. Dies zeigt, dass die ursprüngliche Referenz unverändert bleibt, selbst wenn der Wert des Parameters innerhalb der Funktion geändert wird. Wenn obj innerhalb einer Funktion überschrieben wird, verweist diese Variable tatsächlich auf ein lokales Objekt. Dieses lokale Objekt wird sofort zerstört, wenn die Ausführung der Funktion abgeschlossen ist.
Stellen Sie sich die Parameter von ECMAScript-Funktionen als lokale Variablen vor.
4. Erkennungstyp
Obwohl typeof ein leistungsstarker Assistent beim Erkennen grundlegender Datentypen ist, ist dieser Operator beim Erkennen von Referenztypen nicht sehr nützlich. Normalerweise wollen wir nicht wissen, ob ein Wert ein Objekt ist, sondern um welche Art von Objekt es sich handelt. ECMAScript stellt zu diesem Zweck den Instanzenoperator bereit, dessen Syntax wie folgt lautet: