Heim  >  Artikel  >  Web-Frontend  >  Wird JS als Wert oder durch reference_javascript-Tipps übergeben?

Wird JS als Wert oder durch reference_javascript-Tipps übergeben?

WBOY
WBOYOriginal
2016-05-16 16:16:52908Durchsuche

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

Code kopieren Der Code lautet wie folgt:

void Modify(int p, int * q)
{
p = 27; // Wert übergeben – p ist eine Kopie des tatsächlichen Parameters a, nur p wird geändert
*q = 27; // q ist ein Verweis auf b, sowohl q als auch b werden geändert
}
int main()
{
int a = 1;
int b = 1;
Modify(a, &b); // a wird als Wert übergeben, b wird als Referenz übergeben,
// a hat sich nicht geändert, b hat sich geändert
Return(0);
}

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.

Code kopieren Der Code lautet wie folgt:

var a = 1;
Funktion foo(x) {
x = 2;
}
foo(a);
console.log(a); // Immer noch 1, nicht betroffen von x = 2 Zuweisung

Schauen Sie sich das Objekt noch einmal an:

Code kopieren Der Code lautet wie folgt:

var obj = {x : 1};
Funktion foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, geändert!

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:

Code kopieren Der Code 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 geändert.

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.

Code kopieren Der Code 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 geändert.

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.

Code kopieren Der Code lautet wie folgt:

var obj = {x : 1};
Funktion foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, geändert!

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.

Code kopieren Der Code lautet wie folgt:

var str = "abc";
str[0]; // "a"
str[0] = "d";
str; // Immer noch „abc“; Zuweisung ist ungültig. Es gibt keine Möglichkeit, den Inhalt der Zeichenfolge
zu ändern

Aber Objekte sind unterschiedlich, Objekte sind veränderlich.

Code kopieren Der Code lautet wie folgt:

var obj = {x : 1};
obj.x = 100;
var o = obj;
o.x = 1;
obj.x; // 1, geändert
o = wahr;
obj.x; // 1, wird sich aufgrund von o = true nicht ändern

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.

Stellungnahme:
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