Wertübergabe vs. Referenzübergabe: eine ausführliche Diskussion
In meinem ersten technischen Interview wurde mir folgende Frage gestellt: Was ist der Unterschied zwischen der Wertübergabe und der Referenzübergabe? Meine Antwort lautet: Bei der Wertübergabe wird ein Wert übergeben, bei der Referenzübergabe wird eine Referenz übergeben. Obwohl diese Antwort grundlegend und sogar oberflächlich ist, ist sie nicht ganz falsch und bedarf lediglich einer weiteren Erklärung.
Wertübergabe: Der Wert der Variablen wird kopiert und als Parameter an die Funktion übergeben. Die Funktion verwendet diesen kopierten Wert, um verschiedene Operationen auszuführen, und der Wert der ursprünglichen Variablen bleibt unverändert . Fast alle bekannten Programmiersprachen, einschließlich JavaScript und Java, verwenden die Wertübergabe.
Übergabe als Referenz: Eine Referenz bezieht sich auf eine Variable, die auf einen Wert im Speicher zeigt. Betrachten Sie sie als Zeiger. Es wird als Parameter an die Funktion übergeben und erhält über den Parameter einen Alias (Alias-Referenz). Die Funktion führt mithilfe dieses Parameters verschiedene Operationen aus, die Zugriff auf den Speicherort des Werts ermöglichen. Daher wirkt sich jede Operation, die diesen Parameter verwendet, auf den Wert der ursprünglichen Variablen aus und der Wert der ursprünglichen Variablen wird geändert. Nur wenige Programmiersprachen verwenden die Referenzübergabe, beispielsweise verfügt C über diese Funktion, aber selbst in C ist der Standardmodus die Wertübergabe.
Beispiel für die Wertübergabe:
Das folgende Beispiel verwendet JavaScript, das sich strikt an die Wertübergabe hält, unabhängig davon, ob es sich um einen primitiven Typ oder einen Referenztyp (Objekt) handelt. Hier ist ein klassisches Beispiel für eine Swap-Funktion:
<code class="language-javascript">const firstPrimitive = 1; //传递给firstArgument的原始值 const secondPrimitive = 2; //传递给secondArgument的原始值 const firstObject = {name: "first", reason: "Test pass-by-value"}; //传递给firstArgument的对象 const secondObject = {name: "second", reason: "Test pass-by-value"}; //传递给secondArgument的对象 function swap(firstArgument, secondArgument){ const placeholder = secondArgument; secondArgument = firstArgument; firstArgument = placeholder; console.log('当前位于函数内部。'); console.log('firstArgument = ', firstArgument, ', secondArgument = ', secondArgument, '\n'); } console.log('函数执行前。'); console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive); console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n'); swap(firstPrimitive, secondPrimitive); console.log('当前位于函数外部。'); console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive, '\n'); swap(firstObject, secondObject) console.log('当前位于函数外部。'); console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');</code>
Nach der Ausführung dieses Codes sind die Ergebnisse wie folgt:
<code>函数执行前。 firstPrimitive = 1 , secondPrimitive = 2 firstObject = { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' } 当前位于函数内部。 firstArgument = 2 , secondArgument = 1 当前位于函数外部。 firstPrimitive = 1 , secondPrimitive = 2 当前位于函数内部。 firstArgument = { name: 'second', reason: 'Test pass-by-value' } , secondArgument = { name: 'first', reason: 'Test pass-by-value' } 当前位于函数外部。 firstObject = { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }</code>
Beachten Sie, dass innerhalb der Swap-Funktion die beiden Werte vertauscht werden; außerhalb der Funktion bleiben die Werte jedoch gleich.
Beispiel für die Referenzübergabe:
Das folgende Beispiel verwendet C und kann durch Referenzübergabe implementiert werden. Dies kann mit dem Adressoperator (&) erreicht werden. Auch hier wird eine Version der Swap-Funktion verwendet:
<code class="language-c++">#include <stdio.h> void swap(int &i, int &j) { int temp = i; i = j; j = temp; } int main(void) { int a = 10; int b = 20; swap(a, b); printf("A is %d and B is %d\n", a, b); return 0; }</code>
Das Ausgabeergebnis ist:
<code>A is 20 and B is 10</code>
Hier werden die Werte von a und b geändert, da sie als Referenzen verwendet werden.
Zusammenfassung: „Übergabe als Referenz“ bedeutet, dass die Funktion die Speicheradresse der Variablen (per Referenz) erhält, sodass sie die ursprüngliche Variable direkt ändern kann, während „Übergabe als Wert“ bedeutet, dass eine Kopie der Variablen erstellt wird Der Wert wird übergeben, ohne die ursprüngliche Variable zu ändern.
Ist das wichtig?
Die meisten Programmiersprachen verwenden die Wertübergabe, und wir scheinen keine andere Wahl zu haben. Wie trifft das zu? Folgendes habe ich gefunden:
Kommentare willkommen. Danke.
Referenzmaterialien: Wird JavaScript als Referenz übergeben? Übergabe als Referenz (nur C)
Das obige ist der detaillierte Inhalt vonPass-by-Wert vs. Pass-by-Referenz, ist das wichtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!