Beim Erlernen von js bin ich kürzlich auf das Problem der Übergabe von Objekten als Parameter von js-Funktionen gestoßen. Obwohl es einige Zeit gedauert hat, habe ich es endlich verstanden.
Datentyp
Datentypen in JavaScript können in zwei Kategorien unterteilt werden:
Basistypwert-Primitivtyp, wie z. B. Undefiniert, Null, Boolesch, Zahl, Zeichenfolge.
Referenztypwert, also Objekttyp Objekttyp, wie Objekt, Array, Funktion, Datum usw.
Kopieren von Variablen
Wie wir alle wissen, werden die Grundtypen und Referenztypen von Variablen in js auf unterschiedliche Weise gespeichert, was beim Kopieren auch zu unterschiedlichen Variablen führt. Wenn ein Basistypwert von einer Variablen in eine andere kopiert wird, wird der erstere Wert geklont und dann wird der geklonte Wert der letzteren zugewiesen. Daher sind die beiden Werte völlig unabhängig, ihre Werte jedoch das gleiche.
var num1 = 10;var num2 = num1; console.log(num2);//10
Der oben in Num1 gespeicherte Wert ist 10. Wenn der Wert von Num1 Num2 zugewiesen wird, ist der Wert von Num2 ebenfalls 10. Aber diese beiden 10 sind völlig unabhängig. Das ist so, als würde ich ein Word-Dokument schreiben und es in den Ordner von num1 kopieren. und legen Sie diese Kopie dann in den Ordner von num2. Die beiden Word-Dokumente sind genau gleich, und eine Änderung eines der beiden hat keine Auswirkungen auf beide.
num2 += 1; console.log(num1); //10 console.log(num2); //11
Wie oben zu sehen ist, wird der Wert von num2 geändert, aber der Wert von num1 bleibt unverändert. Schauen wir uns das Kopieren von Referenztypen an. Wenn ein Wert eines Referenztyps 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.
var obj1 = { name : "111"};var obj2 = obj1; console.log(obj2.name); //111 obj2.name = "222"; console.log(obj1.name); //222
Das erste gedruckte Ergebnis ist „111“, was für uns leicht zu verstehen ist, aber das zweite gedruckte Ergebnis ist „222“, was etwas rätselhaft ist. Dies ist der Unterschied zwischen Referenztypen und Basistypen. Beim Kopieren eines Objekts wird kein identisches Objekt im Heap-Speicher erstellt, sondern lediglich eine Variable hinzugefügt, die einen Zeiger auf das Objekt enthält. Kopieren Sie den Wert von obj1 nach obj2, und die Kopie dieses Werts ist tatsächlich ein Zeiger auf ein im Heap gespeichertes Objekt. Das heißt, es wird eine neue Speicheradresse erstellt und an obj2, obj1 und obj2 übergeben. Die Variablen verweisen gleichzeitig auf dasselbe Objekt. Wenn das Objekt geändert wird, ändern sich ihre Werte, was bedeutet, dass die von einer von ihnen vorgenommenen Änderungen im anderen widergespiegelt werden. Das vereinfachte Diagramm unten ist möglicherweise klarer.
Übergabe von Funktionsparametern
„JS Advanced Programming“ beschreibt die Parameterübergabe wie folgt: Alle Funktionsparameter werden als Wert übergeben, das heißt, die Parameter außerhalb der Funktion werden kopiert Der Wert des Parameters innerhalb der Funktion entspricht dem Kopieren des Werts von einer Variablen in eine andere. Wenn Sie also das Kopieren von Variablen verstehen, wird die Übergabe von Parametern sehr einfach sein. Beginnen wir mit einem Beispiel für Grundtypen.
var count = 10;function num(num1){ num1 = 1; return num1; }var result = num(count);console.log(result);//1 console.log(count);//10,并未变成1
Dieses Beispiel ist leicht zu verstehen. Es erstellt tatsächlich eine Kopie von count und übergibt dann den Wert von count an den Parameter. Da der Wert des Parameters in der Funktion definiert ist, wird 10 überschrieben Das Ergebnis gibt 1 zurück, aber die Anzahl hat sich nicht geändert. Schauen wir uns ein Beispiel für die Übergabe von Objekten an.
var person = { name : "Tom"};function obj(peo){ peo.name = "Jerry"; return peo; }var result = obj(person); console.log(result.name);// Jerry console.log(person.name);// Jerry
Im obigen Beispiel wird person kopiert und an obj() übergeben, und person zeigt auf dasselbe Objekt, und das Ändern des Namensattributs in peo ändert tatsächlich das Objekt, auf das sie gemeinsam zeigen und das Namensattribut, auf das die entsprechende externe Person verweist, ändert sich ebenfalls, sodass das gedruckte Attribut „Jerry“ lautet. Tatsächlich sieht es auf den ersten Blick so aus, als würden Referenztypparameter als Referenz übergeben. Dies war der Fehler, den ich ursprünglich gemacht habe. Schauen wir uns ein anderes Beispiel an.
var person = { name : "Tom"}; function obj(peo){ peo = { name : "Jerry" }; return peo; } var result = obj(person);console.log(result.name);// Jerry console.log(person.name);// Tom
Im obigen Beispiel wird ein Objekt in der Funktion neu definiert, das heißt, es gibt jetzt zwei Objekte im Heap-Speicher. Die externe Person zeigt auf das alte Objekt Parameter Zeigt auf das neu definierte Objekt, sodass der nach dem Aufruf zurückgegebene Wert der Wert des neu definierten Objekts ist. Wenn die Parameter als Referenz übergeben werden, lautet das gedruckte Ergebnis von person.name „Jerry“. Daraus kann geschlossen werden, dass die Parameter als Wert übergeben werden (einige Stellen nennen es „Übergabe durch Teilen“).
Wir haben „Eine kurze Geschichte der Menschheit“ verwendet, die von Lao Luo empfohlen wurde, um es zu visualisieren, aber die Beschreibung ist nicht sehr gut. Der Titel des ersten Kapitels der kurzen Geschichte lautet „Kognitive Revolution“. Wir haben den Namen in „Person“ geändert. Entsprechend der Anzahl der Seiten können wir direkt den Inhalt von „Kognitive Revolution“ finden, d. h. das Objekt gezeigt von peoson". Zweites Das Kapitel ist „Landwirtschaftliche Revolution“, wir nennen es „Ergebnis“, und sein Unterverzeichnis enthält einen Abschnitt „Speicherüberlastung“ (umbenannt in „peo“). Sie können den Inhalt dieses Abschnitts auch direkt finden basierend auf der Seitenzahl. Jetzt kopieren wir „person“ in „peo“, der Abschnitt „peo“ in Kapitel 2 wird zu „person“, und was wir basierend auf „peoson“ in Kapitel 1 finden, ist immer noch das in Kapitel 1 Inhalt, weil sie zeigen auf unterschiedliche Inhaltsbereiche zugeschnitten sind und sich nicht gegenseitig stören. Hier ist der Heap-Speicher der Inhalt jedes Kapitels, und der Inhalt von Kapitel 1 und Kapitel 2 sind zwei verschiedene Objekte, und die beiden haben nichts miteinander zu tun, sodass beim Drucken von externem person.name das Ergebnis immer noch das vorherige Objekt ist Attributwert.
Fazit
Kurz gesagt, Parameter in js werden als Wert übergeben. Die Beispiele, die ich geschrieben habe, sind etwas grob, aber die Beispiele in „JavaScript Advanced Programming“ sind klarer und leichter zu verstehen.
Verwandte Empfehlungen:
Das Implementierungsprinzip von Funktionsparametern in js
Die tatsächlichen Parameter, formalen Parameter und den Abschluss verstehen
Das obige ist der detaillierte Inhalt vonSo übertragen Sie Funktionen in js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!