suchen
HeimWeb-Frontendjs-TutorialDiskussion darüber, ob Werte in JavaScript per Wert oder durch Referenz_Javascript-Fähigkeiten übergeben werden

Ich bin kürzlich auf eine interessante Frage gestoßen: „Werden Werte in JS als Wert oder als Referenz übergeben?“
Bevor wir dieses Problem analysieren, müssen wir verstehen, was Call-by-Value und was Call-by-Reference ist. In der Informatik wird dieser Teil als Evaluationsstrategie bezeichnet. Es bestimmt, wie beim Aufruf von Funktionen Werte zwischen Variablen und zwischen Aktualparametern und Formalparametern übergeben werden.


Übergabe nach Wert VS. Übergabe nach 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 wir uns 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?


Call-by-Sharing Um genau zu sein, 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.
Code kopieren Der Code lautet wie folgt:

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.

Unveränderliche Natur der Grundtypen

Grundtypen sind unveränderlich (unveränderlich), nur Objekte sind veränderlich (veränderlich), zum Beispiel der numerische Wert 100, boolesche Werte wahr, falsch, ändern Sie diese Werte (z. B. ändern Sie 1 in 3, ändern). wahr bis 100) hat keine 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, deren Wert Objekt ist, 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
Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AM

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten

JavaScript: Erforschung der Vielseitigkeit einer WebspracheJavaScript: Erforschung der Vielseitigkeit einer WebspracheApr 11, 2025 am 12:01 AM

JavaScript ist die Kernsprache der modernen Webentwicklung und wird für seine Vielfalt und Flexibilität häufig verwendet. 1) Front-End-Entwicklung: Erstellen Sie dynamische Webseiten und einseitige Anwendungen durch DOM-Operationen und moderne Rahmenbedingungen (wie React, Vue.js, Angular). 2) Serverseitige Entwicklung: Node.js verwendet ein nicht blockierendes E/A-Modell, um hohe Parallelitäts- und Echtzeitanwendungen zu verarbeiten. 3) Entwicklung von Mobil- und Desktop-Anwendungen: Die plattformübergreifende Entwicklung wird durch reaktnative und elektronen zur Verbesserung der Entwicklungseffizienz realisiert.

Die Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenDie Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenApr 10, 2025 am 09:33 AM

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

Entmystifizieren JavaScript: Was es tut und warum es wichtig istEntmystifizieren JavaScript: Was es tut und warum es wichtig istApr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Ist Python oder JavaScript besser?Ist Python oder JavaScript besser?Apr 06, 2025 am 12:14 AM

Python eignet sich besser für Datenwissenschaft und maschinelles Lernen, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python ist bekannt für seine prägnante Syntax- und Rich -Bibliotheks -Ökosystems und ist für die Datenanalyse und die Webentwicklung geeignet. 2. JavaScript ist der Kern der Front-End-Entwicklung. Node.js unterstützt die serverseitige Programmierung und eignet sich für die Entwicklung der Vollstapel.

Wie installiere ich JavaScript?Wie installiere ich JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript erfordert keine Installation, da es bereits in moderne Browser integriert ist. Sie benötigen nur einen Texteditor und einen Browser, um loszulegen. 1) Führen Sie sie in der Browser -Umgebung durch, indem Sie die HTML -Datei durch Tags einbetten. 2) Führen Sie die JavaScript -Datei nach dem Herunterladen und Installieren von node.js nach dem Herunterladen und Installieren der Befehlszeile aus.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor