Heim > Web-Frontend > js-Tutorial > Pass-by-Wert vs. Pass-by-Referenz, ist das wichtig?

Pass-by-Wert vs. Pass-by-Referenz, ist das wichtig?

Susan Sarandon
Freigeben: 2025-01-20 18:51:08
Original
425 Leute haben es durchsucht

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.

Pass By Value vs. Pass By Reference, Does It Matter?

Ü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.

Pass By Value vs. Pass By Reference, Does It Matter?

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 dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Das Ausgabeergebnis ist:

<code>A is 20 and B is 10</code>
Nach dem Login kopieren

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:

  • Verwenden Sie die Wertübergabe, wenn Sie einen Parameter nur „verwenden“, um einige Berechnungen durchzuführen, ohne ihn für das Clientprogramm zu ändern.
  • Verwenden Sie die Referenzübergabe, wenn Sie eine Funktion benötigen, um den ursprünglichen Wert einer als Argument übergebenen Variablen zu ändern, da sie direkt am Speicherort der Variablen arbeitet, anstatt eine Kopie zu erstellen, was sie effizienter macht, insbesondere wenn Umgang mit großen Datenstrukturen (wie einem komplexen Objekt oder Array); es vermeidet den Aufwand für das Kopieren der Daten und ermöglicht die direkte Änderung der Originalvariablen innerhalb der Funktion. Die Übergabe als Referenz kann die Leistung verbessern.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage