Übergabe als Wert VS. Übergabe als Referenz
Call by Value ist die am häufigsten verwendete Auswertungsstrategie: Die formalen Parameter einer Funktion sind Kopien der tatsächlichen Parameter, die beim Aufruf übergeben werden. Eine Änderung des Werts des Formalparameters hat keinen Einfluss auf den Aktualparameter.
Bei der Referenzübergabe (Call by Reference) erhalten die formalen Parameter der Funktion implizite Referenzen auf die tatsächlichen Parameter und keine Kopien. Dies bedeutet, dass bei einer Änderung der Werte von Funktionsparametern auch die tatsächlichen Parameter geändert werden. Gleichzeitig weisen beide auf den gleichen Wert hin.
Die Übergabe als Referenz erschwert die Verfolgung von Funktionsaufrufen und führt manchmal zu subtilen Fehlern.
Die Wertübergabe erfordert jedes Mal einen Klon, sodass die Leistung bei einigen komplexen Typen geringer ist. Beide Methoden der Wertübergabe haben ihre eigenen Probleme.
Schauen wir uns zunächst ein C-Beispiel an, um den Unterschied zwischen der Wertübergabe und der Referenzübergabe zu verstehen:
Hier können wir sehen:
a => Wenn p als Wert übergeben wird, wirkt sich die Änderung des Werts des formalen Parameters p nicht auf den tatsächlichen Parameter a aus, der nur eine Kopie von a ist.
b => q wird als Referenz übergeben. Das Ändern des Werts des formalen Parameters q wirkt sich auch auf den Wert des tatsächlichen Parameters b aus.
Entdecken Sie, wie JS-Werte übergeben werden
Die Grundtypen von JS werden als Wert übergeben.
Schauen Sie sich das Objekt noch einmal an:
Erklären Sie, dass o und obj dasselbe Objekt sind und o keine Kopie von obj ist. Es wird also nicht als Wert übergeben. Aber bedeutet das, dass JS-Objekte per Referenz übergeben werden? Schauen wir uns das folgende Beispiel an:
Wenn es als Referenz übergeben wird, sollte sich die Änderung des Werts des formalen Parameters o auf den tatsächlichen Parameter auswirken. Eine Änderung des Werts von o hier hat jedoch keinen Einfluss auf obj. Daher werden Objekte in JS nicht als Referenz übergeben. Wie wird also der Wert des Objekts in JS übertragen?
Anruf durch Teilen
Genauer gesagt werden Basistypen in JS als Wert übergeben, und Objekttypen werden durch Teilen übergeben (Aufruf durch Teilen, auch Übergeben durch Objekt und Übergeben durch Objektteilen genannt). Es wurde erstmals 1974 von Barbara Liskov in der GLU-Sprache vorgeschlagen. Diese Bewertungsstrategie wird in Python, Java, Ruby, JS und anderen Sprachen verwendet.
Der Kernpunkt dieser Strategie ist: Wenn eine Funktion aufgerufen wird, um Parameter zu übergeben, akzeptiert die Funktion eine Kopie der Objektargumentreferenz (weder eine Kopie des als Wert übergebenen Objekts noch eine als Referenz übergebene implizite Referenz). Der Unterschied zur Referenzübergabe besteht darin, dass die Zuweisung von Funktionsparametern bei der gemeinsamen Übertragung keinen Einfluss auf den Wert des tatsächlichen Parameters hat. Wie im folgenden Beispiel kann der Wert von obj nicht durch Ändern des Werts des formalen Parameters o geändert werden.
Obwohl es sich bei der Referenz um eine Kopie handelt, ist das referenzierte Objekt dasselbe. Sie teilen sich dasselbe Objekt, daher wirkt sich das Ändern der Eigenschaftswerte des formalen Parameterobjekts auch auf die Eigenschaftswerte der tatsächlichen Parameter aus.
Da das Objekt bei Objekttypen veränderbar ist, wirkt sich die Änderung des Objekts selbst auf die Referenzen und Referenzkopien aus, die das Objekt gemeinsam nutzen. Da alle Basistypen unveränderlich sind, gibt es keinen Unterschied zwischen der Übergabe durch Teilen und der Übergabe nach Wert (Aufruf nach Wert). Daher entsprechen JS-Basistypen sowohl der Übergabe durch Wert als auch der Übergabe durch Teilen.
var a = 1; // 1 ist Zahlentyp, unveränderlich var b = a; b = 6;
Gemäß der Pass-by-Share-Bewertungsstrategie sind a und b zwei verschiedene Referenzen (b ist eine Referenzkopie von a), beziehen sich jedoch auf denselben Wert. Da der Grundtyp Nr. 1 hier unveränderlich ist, gibt es keinen Unterschied zwischen der Übergabe nach Wert und der Übergabe durch Teilen.
Die Unveränderlichkeit der Grundtypen
Grundtypen sind unveränderlich (unveränderlich), nur Objekte sind veränderlich (veränderlich). Beispielsweise ist der numerische Wert 100, der boolesche Wert wahr, falsch und ändert diese Werte (z. B. Ändern von 1 in 3, Ändern von wahr in 100). ) nicht Was ist die Bedeutung. Was leichter zu missverstehen ist, ist der String in JS. Manchmal versuchen wir, den Inhalt einer Zeichenfolge zu „ändern“, aber in JS erstellt jede Operation, die scheinbar einen Zeichenfolgenwert „ändert“, tatsächlich einen neuen Zeichenfolgenwert.
Aber Objekte sind unterschiedlich, Objekte sind veränderlich.
Hier definieren wir die Variable obj, der Wert ist object, und setzen dann den Wert des Attributs obj.x auf 100. Definieren Sie dann eine weitere Variable o, deren Wert immer noch das Objektobjekt ist. Zu diesem Zeitpunkt verweisen die Werte der beiden Variablen obj und o auf dasselbe Objekt (verweisen gemeinsam auf dasselbe Objekt). Daher wirkt sich eine Änderung des Objektinhalts sowohl auf obj als auch auf o aus. Das Objekt wird jedoch nicht als Referenz übergeben. Der Wert von o wird durch o = true geändert, was keinen Einfluss auf obj hat.