Ob JavaScript ein Pass-by-Referenz- oder ein Pass-by-Wert-Typ ist

  1. Primitive Datentypen in JavaScript werden nach Wert übergeben
  2. Nicht-primitive Werte in JavaScript werden als Referenz übergeben
  3. JavaScript ist sowohl Wertübergabe als auch Referenzübergabe

Bevor wir uns eingehend damit befassen, ob die Programmiersprache JavaScript ein Typ einer Referenzübergabe ist oder nicht, sehen wir uns zunächst den Unterschied zwischen Wertübergabe und Referenzübergabe an.

Diese Dinge kommen normalerweise ins Spiel, wenn wir Zuweisungsoperationen durchführen oder sich mit den Funktionen selbst befassen. Da wir die meiste Zeit Zuweisungsoperationen ausführen, verschiedene Funktionen erstellen und mehrere Variablen an diese Funktionen übergeben, würde uns das Wissen, wie diese Dinge intern funktionieren, ein tieferes Verständnis der Programmiersprache ermöglichen.

Immer wenn wir den Wert einer Variablen an eine andere Variable oder Funktion zuweisen oder übergeben, wird dies als Wertübergabe bezeichnet. Wenn wir die Adresse einer Variablen an eine andere Variable oder Funktion zuweisen oder übergeben, wird dies als Referenzübergabe bezeichnet.

Nachdem wir nun die grundlegende Definition der Typen der Übergabe von Werten und der Übergabe von Verweisen gesehen haben, wollen wir in den folgenden Beispielen weiter unten verstehen, wie sie verwendet werden.

Primitive Datentypen in JavaScript werden nach Wert übergeben

Beachten Sie, dass es in JavaScript zwei Arten von Datentypen gibt: den primitiven Datentyp und den nicht-primitiven Datentyp. Die primitiven Datentypen bestehen aus Zahlen, Boolean, Strings, undefined und null.

Diese Datentypen haben keine vordefinierten Methoden wie bei Objekten oder Arrays. Die primitiven Datentypen sind unveränderlich; Dies bedeutet, dass sich der Wert der ersten Variablen immer dann nicht ändert, wenn Sie den Wert einer primitiven Variablen speichern oder einer anderen zuweisen und einige Änderungen am Wert der zweiten Variablen vornehmen. Sie bleibt unverändert, bis Sie den Wert dieser Variablen selbst ändern. Erst dann wird die zweite Variable geändert.

Weitere Informationen zu primitiven Datentypen finden Sie auf MDN.

// Example 1
let a = 10;
let b = a;
b = b + 1;

console.log(a);
console.log(b);


// Example 2
let name = "Google";

let greet = (val) => {
   val = "Hi " + name +"!";
   return val;
 }

console.log(name);
console.log(greet(name));

Ausgabe:

10
11
Google
Hi Google!

Der obige Code kann mit Hilfe der folgenden Abbildung besser verstanden werden. Beachten Sie, dass es nur das erste Codebeispiel erläutert; das zweite Beispiel wird größtenteils genauso funktionieren wie das von Beispiel eins.

Beispielvisualisierung des primitiven Typs

In unserem ersten Beispiel haben wir zwei Variablen: a und b. Wir haben unserer Variablen a den Zahlenwert 10 zugewiesen; Dadurch wird ein Platz für die Variable a im Speicher zugewiesen, dargestellt durch die gelbe Farbe mit einer Adresse 0x01(die für dieses Beispiel nur eine willkürliche Adresse ist).

Dann weisen wir der Variablen b die Variable a zu. Dieser Vorgang weist der Variable b den neuen Speicherplatz zu. Hier wird der Wert der Variablen a gespeichert, der 10 ist.

Aus dem obigen Beispiel können wir deutlich sehen, dass die Adresse der beiden Variablen a und b unterschiedlich ist, was bedeutet, dass ihnen unterschiedliche Speicherplätze zugewiesen wurden. Dieses Ergebnis impliziert, dass immer, wenn Sie den Wert der Variablen b als b = b + 1 ändern oder modifizieren, der Wert in der Variablen a nicht geändert wird. Nur der Wert der Variablen b ändert sich und wird 11, da wir ihn um eins erhöhen.

In unserem zweiten Beispiel haben wir eine Variable name mit einem Wert Google darin. Wir haben auch eine Funktion namens greet(), die einen String-Wert als Argument nimmt und einen neuen String zurückgibt. Als Argument an diese Funktion übergeben wir die Variable a (beachten Sie, dass die Übergabe einer Variablen bedeutet, ihren Wert und nicht ihre Adresse zu übergeben). Der Wert Google wird in der lokalen Variablen val der Funktion gespeichert.

Aktuell enthält die Variable val den Wert Google. In der Funktion ändern wir diesen Wert in Hi Google! und dann diesen Wert zurückgeben. Wenn Sie nun sowohl den Wert der Variablen name als auch die Funktionen zusammen mit dem zurückgegebenen Wert ausgeben, sind beide unterschiedlich. Die Variablen name bleiben unverändert, da die beiden Variablen name und val an unterschiedlichen Orten gespeichert sind und wir nur den Wert Google an die Funktion und die Adresse übergeben.

Zuvor haben wir die Definition von Wertübergabe gesehen, die besagt, dass wir den Wert der Variablen nur während einer Zuweisung oder während der Übergabe an eine Funktion übergeben. Die beiden obigen Beispiele haben es in der Praxis gezeigt.

Nicht-primitive Werte in JavaScript werden als Referenz übergeben

Die nicht-primitiven Datentypen bestehen aus Arrays, Objekten oder Klassen. Diese Datentypen haben vordefinierte eingebaute Funktionen, die es uns ermöglichen, die Daten in den Arrays oder Objekten zu manipulieren.

Die primitiven Datentypen sind veränderbar; das bedeutet, dass die Datentypen, die später geändert werden können, als veränderlich bezeichnet werden. Darüber hinaus werden die nicht-primitiven Datentypen durch Verweis aufgerufen. Lassen Sie uns dies anhand des folgenden Beispiels verstehen.

let a = [1,2];
let b = a;
b.push(3);

console.log(a)
console.log(b)

Ausgabe:

[ 1, 2, 3 ]
[ 1, 2, 3 ]

Das Bild für das obige Beispiel ist wie unten gezeigt.

Beispiel für nicht-prämitiven Typ

In diesem Beispiel haben wir ein Array a mit zwei Elementen erstellt: [1,2]. Da ein Array ein nicht-primitiver Datentyp ist, speichert die Variable a nicht alle Array-Elemente. Stattdessen werden die Werte [1,2] an einer anderen Stelle im Speicher abgelegt. In diesem Fall wird die Startadresse dieses Arrays, in diesem Fall 0x01, in der Variablen a gespeichert, wie im obigen Diagramm gezeigt. Da die Variable a die Adresse hat, an der die eigentlichen Array-Elemente gespeichert sind, zeigt sie auf diese Stelle.

Wenn wir Variable a der Variable b zuweisen, speichern wir die in a vorhandene Adresse in der Variablen b. Die Variable b zeigt nun auch auf den gleichen Speicherplatz 0x011 wie die Variable a, da beide dieselbe Speicheradresse haben. Wenn Sie also die Elemente eines Arrays ändern, auf das b zeigt, wird auch a beeinflusst, da beide auf dieselbe Position zeigen.

Hier schieben wir ein neues Element in das Array mit der Variablen b wie b.push(3). Nun durchläuft die Variable b das gesamte Array vom ersten Element 1 bis zum letzten Element 2. Nach dem letzten Element fügt es das neue Element 3 in das Array ein. Wenn Sie beide Variablen a und b ausgeben, sehen Sie, dass beide aufgrund der Referenzierung denselben Wert wie [1,2,3] aufweisen.

Dies wird als Referenzübergabe bezeichnet, da wir die Speicheradresse selbst und nicht den Wert übergeben.

JavaScript ist sowohl Wertübergabe als auch Referenzübergabe

Die Programmiersprache JavaScript unterstützt sowohl die Wertübergabe als auch die Referenzübergabe. Primitive Werte wie Zahlen, Boolean, Strings, undefined und null werden alle von Werten übergeben. Nicht-primitive Typen wie Arrays, Objekte und Klassen werden als Verweis übergeben.