Nach Wert passieren vs. Durch Referenz passieren
Call by Value ist die am häufigsten verwendete Bewertungsstrategie: Die formalen Parameter einer Funktion sind Kopien der tatsächlichen Parameter, die beim Aufrufen übergeben wurden. Das Ändern des Wertes eines formalen Parameters wirkt sich nicht auf den tatsächlichen Parameter aus.
Bei der Übergabe von Referenz (Call by Reference) erhalten die formalen Parameter der Funktion eine implizite Referenz des tatsächlichen Parameters und nicht eine Kopie. Dies bedeutet, dass, wenn der Wert des Funktionsparameters geändert wird, auch der tatsächliche Parameter geändert wird. Beide weisen auf denselben Wert hin.
Durch die Übergabe der Referenz wird die Verfolgung von Funktionen schwieriger und verursacht manchmal einige subtile Fehler.
Pass nach Wert Da die Repliken jedes Mal kloniert werden, ist die Leistung für einige komplexe Typen niedriger. Beide Methoden zur Übergabe von Werten haben ihre eigenen Probleme.
Schauen wir uns zunächst ein C -Beispiel an, um den Unterschied zwischen Wert und Referenz zu verstehen:
Die Codekopie lautet wie folgt:
void modify (int p, int * q)
{
p = 27; // nach Wert bestehen - P ist eine Kopie des tatsächlichen Parameters A, nur P wird modifiziert
*q = 27; // Q ist ein Verweis auf B, und sowohl Q als auch B werden modifiziert
}
int main ()
{
int a = 1;
int b = 1;
Modifizieren (a, & b); // ein Pass nach Wert, b pass für Referenz,
// a hat sich nicht geändert, B hat sich geändert
return (0);
}
Hier können wir sehen:
a => Wenn p mit Wert übergeben wird, hat das Änderungswert des formalen Parameters P den tatsächlichen Parameter A nicht, P ist nur eine Kopie von a.
b => q wird mit Referenz übergeben. Bei der Änderung des Wertes des formalen Parameters q wirkt sich auch der Wert des tatsächlichen Parameters b aus.
Erforschen Sie, wie der JS -Wert übergeben wird
Der Grundtyp von JS wird von Wert übergeben.
Die Codekopie lautet wie folgt:
var a = 1;
Funktion foo (x) {
x = 2;
}
foo (a);
console.log (a); // immer noch 1, nicht von der Zuordnung von x = 2 betroffen
Schauen wir uns das Objekt an:
Die Codekopie lautet wie folgt:
var obj = {x: 1};
Funktion foo (o) {
OX = 3;
}
foo (obj);
console.log (obj.x); // 3, modifiziert!
Erklären Sie O und OBJ sind dasselbe Objekt, und O ist keine Kopie von OBJ. Es wird also nicht von Wert übergeben. Aber bedeutet dies, dass JS -Objekte mit Referenz übergeben werden? Schauen wir uns die folgenden Beispiele an:
Die Codekopie lautet wie folgt:
var obj = {x: 1};
Funktion foo (o) {
o = 100;
}
foo (obj);
console.log (obj.x); // immer noch 1, OBJ wurde nicht auf 100 modifiziert.
Wenn es mit Referenz übergeben wird, sollte der Wert des formalen Parameters O geändert werden, dies sollte den tatsächlichen Parameter beeinflussen. Das Ändern des Wertes von O hier wirkt sich jedoch nicht auf OBJ aus. Daher werden Objekte in JS nicht mit Referenz übergeben. Wie wird der Wert des Objekts in JS übergeben?
Anruf durch Freigabe bestehen
Um genau zu sein, werden die Grundtypen in JS von Werten übergeben und die Objekttypen durch Freigabe übergeben (Anruf durch Freigabe, auch nach Objekt genannt und vom Objekt freigegeben). Es wurde erstmals von Barbara Liskov vorgeschlagen. In der GLU -Sprache von 1974. Diese Bewertungsstrategie wird in Python, Java, Ruby, JS und anderen Sprachen verwendet.
Der Punkt dieser Strategie ist, dass die Funktion, wenn eine Funktion das Argument übergeht, eine Kopie der tatsächlichen Argument -Referenz des Objekts akzeptiert (weder eine Kopie des vom Wert bestehenden Objekts noch eine implizite Referenz, die von Referenz übergeben wurde). Die Differenz zwischen IT und Passing von Referenz besteht darin, dass die Zuordnung von Funktionsparametern in einem gemeinsam genutzten Durchgang den Wert des tatsächlichen Parameters nicht beeinflusst. Wie im folgenden Beispiel kann der Wert von OBJ nicht durch Ändern des Wertes des formalen Parameters o geändert werden.
Die Codekopie lautet wie folgt:
var obj = {x: 1};
Funktion foo (o) {
o = 100;
}
foo (obj);
console.log (obj.x); // immer noch 1, OBJ wurde nicht auf 100 modifiziert.
Obwohl die Referenz eine Kopie ist, ist das referenzierte Objekt gleich. Sie teilen das gleiche Objekt. Durch das Ändern des Attributwerts des formalen Parameterobjekts wirkt sich auch der Attributwert des tatsächlichen Parameters aus.
Die Codekopie lautet wie folgt:
var obj = {x: 1};
Funktion foo (o) {
OX = 3;
}
foo (obj);
console.log (obj.x); // 3, modifiziert!
Da das Objekt, da das Objekt veränderlich ist, das Ändern des Objekts selbst die Freigabe der Referenz- und Referenzkopie des Objekts beeinflusst. Da beide unveränderliche Typen sind, gibt es keinen Unterschied zwischen dem Austausch und dem Bestehen nach Wert (Call by Value), sodass JS -Grundtypen sowohl im Einklang mit dem Wert von Wert als auch im Einklang mit der Verabschiedung von Teilen übereinstimmen.
var a = 1; // 1 ist Typennummer, unveränderliche var b = a; B = 6;
Nach der von Shared verabschiedeten Bewertungsstrategie sind A und B zwei verschiedene Referenzen (B ist eine Referenzkopie von A), verweist jedoch den gleichen Wert. Da die Basistyp Nummer 1 hier unveränderlich ist, gibt es keinen Unterschied zwischen dem Wert von Wert und der Übergabe von Aktien hier.
Unveränderliche Eigenschaften von Grundtypen
Die Grundtypen sind unveränderlich und nur Objekte sind veränderlich. Beispielsweise sind numerische Werte 100, boolesche Werte wahr, falsch und das Ändern dieser Werte (z. B. 1 in 3 und True in 100) macht keinen Sinn. Was leichter zu missverstehen ist, ist eine String in JS. Manchmal versuchen wir, den Inhalt der Zeichenfolge zu "ändern", aber in JS wird jeder "Modify" -Operationsvorgang, der ein String -Wert zu sein scheint, tatsächlich einen neuen String -Wert erstellt.
Die Codekopie lautet wie folgt:
var str = "abc";
STR [0]; // "A"
Str [0] = "D";
str; // immer noch "ABC"; Die Zuordnung ist ungültig. Es gibt keine Möglichkeit, den Inhalt der Zeichenfolge zu ändern
Das Objekt ist anders, das Objekt ist variabel.
Die Codekopie lautet wie folgt:
var obj = {x: 1};
obj.x = 100;
var o = obj;
ox = 1;
obj.x; // 1, geändert
o = wahr;
obj.x; // 1, ändert sich nicht aufgrund von o = true
Hier ist der variable obj definiert, der Wert ist Objekt, und dann wird der Wert der Obj.x -Eigenschaft auf 100 gesetzt. Dann definieren Sie eine andere Variable o, und der Wert ist immer noch dieses Objekt. Zu diesem Zeitpunkt weisen die Werte der beiden Variablen OBJ und O auf dasselbe Objekt hin (die eine Referenz auf dasselbe Objekt teilen). Das Ändern des Inhalts des Objekts wirkt sich daher sowohl auf OBJ als auch auf O aus. Das Objekt wird jedoch nicht mit Referenz übergeben. Der Wert von O wird durch o = true modifiziert und hat OBJ nicht.