Ist JavaScript eine pass-by-reference oder pass-by-value Sprache?
Den primitiven Typen (Number, String, etc.) als Wert übergeben werden, aber Objekte sind unbekannt,, weil Sie kann sowohl passed-by-value (in Fall betrachten wir eine variable, die halten ein Objekt ist in der Tat eine Referenz auf das Objekt) und übergeben durch Referenz (wenn man bedenkt, dass die variable auf das Objekt hält, auf das Objekt selbst).
Obwohl es nicht wirklich wichtig ist am Ende, ich will wissen, was ist der richtige Weg, um die Argumente übergeben Konventionen. Gibt es einen Auszug aus der JavaScript-Spezifikation, die definiert, was sollte die Semantik in Bezug auf diese?
Ich denke, dass Sie versehentlich gespiegelt, Ihre Definitionen der passed-by-value und übergeben-by-reference... "passed-by-value (in Fall betrachten wir eine variable, die halten ein Objekt ist in der Tat eine Referenz auf das Objekt) und übergeben durch Referenz (wenn man bedenkt, dass die variable auf das Objekt hält, auf das Objekt selbst)"
Ja. Unabhängig von der syntax, die in irgendeiner Funktion rufen Sie in einer beliebigen Programmiersprache, pass-by-reference bedeutet, dass die Daten, die im Zusammenhang mit der übergebenen variable wird nicht kopiert, wenn die an die Funktion übergeben und somit alle änderungen, die von der Funktion, um die übergebene variable bleibt im Programm nach dem Aufruf der Funktion beendet. Pass-by-value bedeutet, dass die Daten, die im Zusammenhang mit der variable ist tatsächlich kopiert, wenn die an die Funktion übergeben, und alle änderungen, die durch diese Funktion, um solche Variablen gehen verloren, wenn die variable geht out of scope der Funktion, den Körper, wenn die Funktion zurückgibt.
Ich glaube nicht, dass
Diese alte Frage ist etwas giftig, weil seine stark-von Ihnen positiv bewertet werden Antwort ist falsch. JavaScript ist streng pass-by-value.
Die Terminologie ist leider verwirrend. Die Sache ist die, "pass by value" und "pass by reference" sind Begriffe, die Sie vorher viel mehr modernen Programmiersprache bietet. Die Worte "Wert" und "Referenz" bezieht sich auf konkret, um die parameter in der function call expression. JavaScript immer wertet jeden Ausdruck in einen Aufruf der Funktion parameter-Liste, bevor dem Aufruf der Funktion, so werden die Parameter stets Werte. Die verwirrende Teil ist, dass Verweise auf Objekte sind gängige JavaScript-Werte. Das heißt nicht, dass es ein "pass by reference" Sprache, jedoch.
Ja. Unabhängig von der syntax, die in irgendeiner Funktion rufen Sie in einer beliebigen Programmiersprache, pass-by-reference bedeutet, dass die Daten, die im Zusammenhang mit der übergebenen variable wird nicht kopiert, wenn die an die Funktion übergeben und somit alle änderungen, die von der Funktion, um die übergebene variable bleibt im Programm nach dem Aufruf der Funktion beendet. Pass-by-value bedeutet, dass die Daten, die im Zusammenhang mit der variable ist tatsächlich kopiert, wenn die an die Funktion übergeben, und alle änderungen, die durch diese Funktion, um solche Variablen gehen verloren, wenn die variable geht out of scope der Funktion, den Körper, wenn die Funktion zurückgibt.
Ich glaube nicht, dass
Object.create
können als ordentliche Klon-Technik, D. H. wenn Sie die original-Kopie des Objekts wird es sich auf den Klon, nur die änderungen der Klon nicht auf das ursprüngliche Objekt. Natürlich hat er es nutzt und JavaScript wurde entwickelt, um dieses Konzept (prototypische Vererbung), aber ich denke, es ist irreführend zu nennen Object.create
der einzige Mechanismus für ein Objekt Klonen.Diese alte Frage ist etwas giftig, weil seine stark-von Ihnen positiv bewertet werden Antwort ist falsch. JavaScript ist streng pass-by-value.
Die Terminologie ist leider verwirrend. Die Sache ist die, "pass by value" und "pass by reference" sind Begriffe, die Sie vorher viel mehr modernen Programmiersprache bietet. Die Worte "Wert" und "Referenz" bezieht sich auf konkret, um die parameter in der function call expression. JavaScript immer wertet jeden Ausdruck in einen Aufruf der Funktion parameter-Liste, bevor dem Aufruf der Funktion, so werden die Parameter stets Werte. Die verwirrende Teil ist, dass Verweise auf Objekte sind gängige JavaScript-Werte. Das heißt nicht, dass es ein "pass by reference" Sprache, jedoch.
InformationsquelleAutor Danail Nachev | 2009-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die variable nicht "halten" das Objekt, es enthält einen Verweis. Sie können zuweisen, dass der Verweis auf eine andere variable, die jetzt beide das gleiche Objekt referenzieren. Es ist immer durch Wert übergeben (selbst wenn es das Wert ist eine Referenz...).
Gibt es keine Möglichkeit, ändern Sie den Wert gehalten, indem eine variable als parameter übergeben, das wäre möglich, wenn JS unterstützt durch Verweis übergeben wird.
Der Autor meint, dass durch die übergabe einer Referenz, du bist der übergabe einer Referenz Wert (eine andere Art zu denken, es ist vorbei den Wert der Speicheradresse). Also das ist, warum, wenn Sie deklarieren das Objekt, das original nicht ändern, weil Sie erstellen ein neues Objekt an einen anderen Speicherort. Wenn Sie eine Eigenschaft ändern, wird das ursprüngliche Objekt verändert, denn es verändert dich an den ursprünglichen Speicherort (das war nicht neu zugewiesen).
InformationsquelleAutor Shog9
My 2 Cents.... Dies ist der Weg, ich verstehe es. (Fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch Liege)
Ist es Zeit zu werfen, alles, was Sie über pass-by-value /Referenz.
, Weil in JavaScript, egal, ob es übergeben wird durch einen Wert oder Verweis oder was auch immer.
Was zählt, ist die mutation vs Belegung der Parameter einer Funktion übergeben werden.
OK, lass mich mein bestes tun, zu erklären, was ich meine. Lassen Sie uns sagen, Sie haben ein paar Objekte.
Was wir getan haben, ist die "Zuordnung"... Wir zugewiesen haben 2 separate leere Objekte die Variablen "Objekt1" und "objekt2".
Nun, lasst uns sagen, dass wir wie Objekt1 besser... Also, wir "weisen" eine neue variable.
Nächsten, aus welchem Grund auch immer, wir entscheiden, dass wir wie Objekt 2 besser. Also, wir nehmen einfach ein wenig re-Belegung.
Ist nichts passiert Objekt1 oder objekt2. Wir haben sich nicht verändert, alle Daten auf allen. Alles, was wir Taten, war neu ordnen, was unsere Lieblings-Objekt ist. Es ist wichtig zu wissen, dass objekt2 und favoriteObject sind sowohl alle zugewiesenen als auch auf das gleiche Objekt. Wir können das Objekt über eine dieser beiden Variablen.
OK, schauen wir uns nun an primitive wie strings zum Beispiel
Wieder, wir wählen Sie einen Favoriten.
Sowohl unsere favoriteString und Variablen string1 zugewiesen sind, 'Hallo Welt'. Nun, was wenn wir das ändern wollen unsere favoriteString??? Was wird passieren???
Uh oh.... Das was passiert ist. Wir konnte es nicht ändern, string1 durch die änderung favoriteString... Warum?? da Zeichenfolgen unveränderlich sind, und wir nicht mutieren. Alles, was wir Taten, war, "NEU ZUWEISEN" favoriteString zu einem neuen string. Dies ist im wesentlichen getrennt ist es von string1. In dem vorherigen Beispiel, wenn wir uns umbenannt unserer Sache, die wir nicht zuordnen nichts. (Gut, eigentlich... haben wir getan, wir schickten Sie die name-Eigenschaft auf eine neue Zeichenfolge.) Stattdessen haben wir einfach mutiert das Objekt hält, die verbindungen zwischen den 2 Variablen und der zugrunde liegenden Objekte.
Nun, auf Funktionen und Parameterübergabe.... Wenn Sie eine Funktion aufrufen, und übergeben Sie einen parameter, was Sie im wesentlichen tun, ist die "Zuordnung", um eine neue variable, und es funktioniert genau das gleiche, als wenn Sie einfach zugewiesen mit dem Gleichheitszeichen ( = ).
Nehmen diese Beispiele.
Nun, die gleiche Sache, aber mit einer Funktion
OK, jetzt geben wir ein paar Beispiele für die Verwendung von Objekten statt... zunächst ohne Funktion.
Nun, die gleiche Sache, aber mit einem Funktionsaufruf
OK, wenn Sie Lesen, durch diese ganzen post, vielleicht haben Sie jetzt ein besseres Verständnis, wie Funktionsaufrufe funktionieren in javascript. Es spielt keine Rolle, ob etwas übergeben als Verweis oder Wert... Was zählt, ist die Zuordnung vs-mutation.
Jedes mal, wenn Sie übergeben Sie eine variable an eine Funktion, Sie sind "Zuordnung" auf das, was der name der parameter-variable ist, wie wenn Sie das Gleichheitszeichen ( = ).
Immer daran denken, dass die ist-gleich-Zeichen (=) bedeutet Zuordnung.
Denken Sie immer daran, dass die übergabe eines Parameters an eine Funktion bedeutet auch die Zuweisung.
Sie sind die gleichen und der 2 Variablen verbunden sind, in genau der gleichen Weise.
Das einzige mal, dass die änderung einer variable wirkt auf eine andere variable ist, wenn das zugrunde liegende Objekt mutiert ist.
Gibt es keinen Punkt in der Unterscheidung zwischen Objekten und primitiven, weil es funktioniert auf die gleiche genaue Art und Weise, wie wenn Sie nicht eine Funktion haben und einfach das Gleichheitszeichen zuweisen, um eine neue variable.
Das einzige Manko ist, wenn der name der variable, die Sie übergeben Sie in der Funktion ist der gleiche wie der name der Funktion parameter. Wenn dies geschieht, müssen Sie behandeln den parameter innerhalb der Funktion, als ob es war eine ganz neue variable privat, um die Funktion (weil es ist)
foo(char *a){a="hello";}
tut nichts, aber wenn Sie das tunfoo(char *a){a[0]='h';a[1]='i';a[2]=0;}
es geändert wird draußen, weila
ist eine Speicherstelle, die als Wert übergeben, der auf eine string (char-array). Vorbei an Strukturen (ähnlich zu js-Objekte) durch den Wert in C ist erlaubt, aber nicht empfohlen. JavaScript einfach erzwingt diese "best practices" und blendet die überflüssigen und meist unerwünschten Reste... und sicher, es macht für das Lesen zu vereinfachen.Dies ist korrekt - die Begriffe pass-by-value und pass-by-reference haben Bedeutungen in der Programmierung Sprache-design, und diese Bedeutungen haben nichts zu tun mit der Objekt-mutation. Es geht darum, wie die Funktion Parameter arbeiten.
Nun, ich verstehe, dass obj1 = obj2 bedeutet, dass beide obj1 und obj2 sind jetzt auf das gleiche Referenz-Position, und wenn ich änderungen an den Interna von obj2, verweisen auf obj1 wird expose die gleichen Interna. Wie kopiere ich ein Objekt so, dass wenn ich
source = { "id":"1"}; copy = source /*this is wrong*/; copy.id="2"
sind, dass die Quelle noch {"id":"1"}?Ich gepostet, andere Antwort mit den traditionellen Definitionen hoffentlich reduzieren Verwirrung. Traditionelle Definitionen von "pass-by-value" und "pass-by-reference" definiert wurden, zurück in den Tag-Speicher-Pointer, bevor die automatische dereferenzieren. Es war vollkommen klar, dass eine object-variable, die den Wert war tatsächlich der Speicher Zeiger die Lage, nicht das Objekt. Obwohl Sie in Ihrer Diskussion der Zuordnung vs mutation ist vielleicht nützlich, es ist nicht notwendig, werfen Sie die traditionellen Begriffe noch deren Definitionen. Mutation, Abtretung, übergabe per Wert übergabe per Referenz, etc. müssen nicht im Widerspruch zueinander stehen.
bedeutet "Nummer" ist eine "unveränderliche" zu?
InformationsquelleAutor Ray Perea
Folgendes:
So,
vergessen "pass by reference/value"nicht bekommen aufgehängt auf "pass by reference/value", weil:Deine Frage zu beantworten: Zeiger übergeben werden.
Einige abschließende Bemerkungen:
{'George', 1}
Werte, aber nur eine von Ihnen zu einer Zeit, dann, wie die anderen es geschafft? Und was passiert, wenn ich einer Variablen zuweisen, um den Wert einer anderen variable? Bin ich dann verweist ein Zeiger, oder verweist auf die pointee des rechten Operanden? Tutvar myExistingVar = {"blah", 42}; var obj = myExistingVar;
Ergebnis inobj
Hinweis auf{"blah", 42}
odermyExistingVar
?Diese verdienen Ihren eigenen Fragen und sind wahrscheinlich schon besser beantwortet als ich verwalten kann. Dass gesagt wird, die
1)
ich lief ein memory profile in den browser dev tools eine loop-Funktion wie die, die Sie beschrieben, und sah die Spitzen im Speicherverbrauch während der looping-Verfahrens. Dieses würde scheinen, zu zeigen, dass neue identische Objekte sind in der Tat in jeder iteration der Schleife. Wenn die Stacheln plötzlich fallen dem garbage collector nur gereinigt bis eine Gruppe von unbenutzten Objekten.In Bezug auf so etwas wie
var a = b
-, javascript-keinen Mechanismus für die Verwendung von Zeigern und so eine variable kann niemals zu einem Zeiger (wie in C), obwohl die zugrunde liegenden javascript-engine zweifellos verwendet. So...var a = b
zeigena
"der pointee des rechten Operanden"Ich fragte Frage #1 hier (speziell über Chrome, weil die Umsetzung ist wahrscheinlich anders im jedem browser) stackoverflow.com/q/42778439/539997 und ich bin immer noch versuchen zu denken, wie man word-Frage #2. Jede Hilfe ist willkommen.
Fairer Punkt. Ich habe versucht, zu klären.
InformationsquelleAutor geg
Objekt außerhalb einer Funktion ist, die einer Funktion übergeben, indem eine Referenz auf das Objekt außerhalb. Wenn Sie mit dieser Referenz zu manipulieren das Objekt, das Objekt außerhalb, ist also betroffen. Allerdings, wenn innerhalb der Funktion, die Sie beschlossen, den Verweis auf etwas anderes, Sie hatte keinen Einfluss auf das Objekt außerhalb, denn alles, was Sie Tat, war re-direct die Referenz auf etwas anderes.
InformationsquelleAutor user779764
Betrachten Sie es wie folgt: Es ist immer durch Wert übergeben. Allerdings ist der Wert eines Objekts nicht das Objekt selbst, sondern eine Referenz auf das Objekt.
Hier ist ein Beispiel, wobei eine Zahl (ein primitiver Typ)
Wiederholen dieses mit einem Objekt ergibt unterschiedliche Ergebnisse:
Noch ein Beispiel:
InformationsquelleAutor Phil Mander
Javascript ist immer pass-by-value, alles ist von Wert geben. Objekte sind Werte, die member-Funktionen der Objekte sind die Werte, die sich (denken Sie daran, dass Funktionen erstklassige Objekte in Javascript). Auch in Bezug auf das Konzept, dass alles in Javascript ist eine Objekt, das ist falsch. Strings, Symbole, zahlen, Boolesche Werte, null-Werte und undefineds sind primitive. Bei Gelegenheit können Sie nutzen, einige member-Funktionen und Eigenschaften geerbt von Ihrer Basis Prototypen, aber das ist nur für die Bequemlichkeit, es nicht bedeutet, dass Sie Objekte selbst. Versuchen Sie die folgenden für Referenz
In beiden Warnungen finden Sie den Wert undefined.
Es ist immer durch Wert übergeben. Zeitraum. Ein Verweis auf das Objekt übergeben wird Wert, die der Funktion. Das ist nicht durch Verweis übergeben wird. "Pass by reference" konnte nahezu gehalten werden, wobei die variable selbst, sondern als sein Wert; beliebiger ändert die Funktion auf das argument (einschließlich ersetzen Sie es mit einem anderen Objekt vollständig!) würde sich in den Anrufer. Das Letzte bit ist nicht möglich in JS, da JS nicht pass by reference -- es geht Verweise von Wert. Die Unterscheidung ist subtil, aber sehr wichtig für das Verständnis seine Grenzen.
Für die Zukunft Stapler... Über diese Referenz von dir:
x = "teste"; x.foo = 12;
etc. Nur weil ein Grundstück ist nicht persistent sind, bedeutet nicht, es ist nicht ein Objekt. Als MDN sagt:MDN ist ein user-wiki bearbeitet, und es ist falsch. Die normative Referenz ist ECMA-262. Siehe S. 8 "Die Referenz Spezifikation Typ", die erklärt, wie Referenzen aufgelöst werden, und auch 8.12.5 "[[Put]]", die verwendet wird, um zu erklären, AssignmentExpression auf eine Referenz, und für Objekt coersion 9.9 ToObject. Für primitive Werte, die Michael bereits erklärt, was ToObject nicht, wie in der Spezifikation. Aber siehe auch s. 4.3.2 primitive Wert.
Nein, ist er nicht. Menschen, die noch nie in der Lage, um pass by reference kann nie verstehen, die Unterschiede zwischen übergabe per Referenz übergabe einer Referenz durch Wert. Aber Sie sind da und Sie sind wichtig. I don ' T care haben die Leute nur dazu führen, es klingt erleichtert.
InformationsquelleAutor Michael Roberts
In JavaScript, der Typ des Wertes allein steuert, ob dieser Wert zugewiesen werden, indem Wert-Kopie oder durch Referenz-Kopie.
Primitive Werte werden immer zugewiesen/passed by value-Kopie:
null
undefined
ES6
Zusammengesetzte Werte werden immer zugewiesen/Verweis übergeben-Kopie
Beispielsweise
In der obigen Schnipsel, weil
2
skalaren primitiven,a
hält eine Initiale Kopie des Werts undb
zugeordnet ist, eine weitere Kopie des Wertes. Beim Wechselb
Sie sind in keiner Weise ändern Sie den Wert ina
.Aber beide
c
undd
getrennt sind Referenzen auf das gleiche shared value[1,2,3]
, das ist ein zusammengesetzter Wert. Es ist wichtig zu beachten, dass wederc
nochd
mehr "Eigentümer" der[1,2,3]
Wert-beide sind genau gleich peer Verweise auf den Wert. Also, bei Verwendung einer Referenz zu ändern (.push(4)
) die tatsächliche gemeinsamearray
Wert an sich, es beeinflusst nur die eine, gemeinsame Wertschöpfung, und beide Referenzen verweisen auf die gerade geänderte Wert[1,2,3,4]
.Wenn wir die Zuordnung
b = [4,5,6]
sind wir absolut gar nichts tun, um zu beeinflussen, woa
ist noch immer auf ([1,2,3]
). Zu tun, dassb
müsste ein Zeiger auf eina
eher als ein Verweis auf diearray
-- aber keine solche Möglichkeit besteht in JS!Wenn wir übergeben das argument
a
, weist es eine Kopie dera
Verweis aufx
.x
unda
sind separate Referenzen zeigen auf den gleichen[1,2,3]
Wert. Nun, innerhalb der Funktion, die wir verwenden können, dass die Referenz zu mutieren, der Wert selbst (push(4)
). Aber wenn wir die Zuordnungx = [4,5,6]
ist dies in keiner Weise beeinflussen, wo die ursprüngliche Bezugnahmea
zeigt-immer noch Punkte auf der (jetzt geändert)[1,2,3,4]
Wert.Effektiv pass einen zusammengesetzten Wert (wie ein
array
) von Wert-kopieren, müssen Sie manuell erstellen Sie eine Kopie, so dass der Verweis übergeben, nicht immer noch auf das original. Zum Beispiel:Zusammengesetzte Wert (Objekt, array, etc), die per Referenz übergeben werden-kopieren
Hier
obj
fungiert als wrapper für die skalaren primitiven Eigenschafta
. Wenn übergebenfoo(..)
eine Kopie desobj
Referenz übergeben wird und derwrapper
parameter. Wir jetzt können diewrapper
Verweis auf das gemeinsame Objekt zugreifen, und aktualisieren Sie die Eigenschaft. Nachdem die Funktion beendet ist,obj.a
sehen die aktualisierten Wert42
.Quelle
Einführung der neuen Terminologie (Wert-Kopie/Referenz-Kopie) und das macht die Dinge komplizierter. Es sind nur Kopien, Zeitraum. Wenn Sie an einem primitiven, die Sie übergeben eine Kopie des eigentlichen primitiven Daten, wenn Sie ein Objekt übergeben, übergeben Sie eine Kopie des Objekts im Speicher. Das ist alles, was Sie zu sagen brauchen. Nichts mehr nur noch weiter verwirrt die Leute.
InformationsquelleAutor zangw
Eine sehr ausführliche Erklärung über das kopieren, die Weitergabe und den Vergleich von Wert und per Referenz in in diesem Kapitel von "JavaScript: The Definitive Guide" buchen.
Eine Sache, die ich noch nicht herausfinden. Überprüfen Sie code unten. Irgendwelche Gedanken?
So scheint es, dass B. Prototypen.bar = A. prototype.foo; zugeordnet ist, die durch Verweis, sondern letztere A. Prototyp.foo = function() {...} verändert den Wert der foo-Eigenschaft von A. Prototyp und bricht die Referenz. B. Prototypen.bar hält immer noch die Referenz zu der ersten Funktion.
Einstellung einer Funktion gleich dem anderen ist nicht eine Zuweisung von Referenz. 'foo' und 'bar' werden nur Funktionen, die Mitglieder der Objekte A und B
Hier ist eine demo-Implementierung der Funktion, als ein einzelnes array-Mitglied statt. Ein array kopiert werden, das durch Verweis, sondern eine Funktion, Kopie durch den Wert. jsfiddle.net/ug04ks33
InformationsquelleAutor igor
JavaScript übergibt primitiven Datentypen Wert und Objekt-Typen, die durch Verweis
— Brian Bi - Welche Programmiersprachen sind pass by reference?
Update
Hier ist eine Widerlegung dieser:
Es gibt kein "pass by reference" in JavaScript zur Verfügung stehen.eine
Sieht mir Recht sein. Pflege zu erarbeiten?
Denn das ist die Beschreibung durch Wert übergeben, nicht als Verweis übergeben. Diese Antwort ist gut, zeigt den Unterschied: stackoverflow.com/a/3638034/3307720
Ich verstehe den Unterschied. #1 und #2 sind die Beschreibung pass-by-ref-Semantik. #3 Beschreibung pass-by-value-Semantik.
1, 2, und 3 sind alle im Einklang mit pass-by-value. Haben referenzübergabe Sie müssten auch 4: zuweisen der Referenz auf einen neuen Wert innerhalb der Funktion (mit den = - operator) auch eine Neuzuordnung der Referenz außerhalb der Funktion. Dies ist nicht der Fall mit Javascript, so dass es ausschließlich durch Wert übergeben. Bei der übergabe eines Objekts, übergeben Sie einen Zeiger auf das Objekt, und übergeben Sie diesen Zeiger durch Wert.
InformationsquelleAutor georgeawg
Es gibt einige Diskussion über die Verwendung des Begriffs "pass by reference" in JS hier, aber um deine Frage zu beantworten:
(Aus dem Artikel oben erwähnt.)
InformationsquelleAutor Jack Sleight
Übergeben von Argumenten an eine Funktion in JavaScript Analog zu übergeben
Parameter durch Zeiger-Wert in C:
InformationsquelleAutor John Sonderson
Semantik!! Die Festlegung konkreter Definitionen unbedingt ein paar Antworten und Kommentare unvereinbar, da Sie nicht beschreibt, die gleiche Sache, auch wenn mit den gleichen Worten und Phrasen, aber es ist wichtig, um vorbei an der Verwirrung (vor allem für neue Programmierer).
Zuerst von all, es gibt mehrere Ebenen der Abstraktion, die nicht jeder scheint zu verstehen. Neuere Programmierer, die gelernt haben, am 4. oder 5. generation Sprachen Schwierigkeiten haben können, wickeln Ihre Meinung rund um Konzepte kennen, um Montage-oder C-Programmierer nicht schrittweise durch Zeiger auf Zeiger auf Zeiger. Pass-by-reference heißt nicht nur, die Fähigkeit zur änderung einer referenzierten Objekt mit einer Funktion parameter-variable.
Variable: Kombinierte Begriff des symbols, der auf einem Wert an einer bestimmten Stelle im Speicher. Dieser Begriff ist in der Regel zu geladen, um alleine verwendet werden, in die Diskussion über details.
Symbol: Text-Zeichenfolge zum verweisen auf Variablen (d.h. Variablen mit den Namen).
Wert: Bestimmte bits im Speicher abgelegt und verwiesen mit Variablen symbol.
Speicher: Wo den Wert einer variable gespeichert ist. (Der Ort selbst wird dargestellt durch eine Zahl getrennt von den gespeicherten Wert an der Stelle.)
Funktion parameter: deklarierte Variable in der definition einer Funktion, verwendet für die Referenzierung von Variablen an die Funktion übergeben.
Funktion argument: Variable außerhalb der Funktion, die übergeben wird an die Funktion durch den Aufrufer.
Objekt-variable: Variable, deren zugrunde liegende Wert nicht dem "Objekt" selbst, sondern Ihr Wert ist ein Zeiger (Speicherstelle, Wert) an eine andere Stelle im Speicher, wo das Objekt die eigentlichen Daten gespeichert werden. In den meisten höher-generation Sprachen, die "pointer" - Aspekt ist effektiv versteckt durch automatische de-referenzieren in verschiedenen Kontexten.
Primitive variable: Variable, deren Wert IST der tatsächliche Wert. Auch dieses Konzept kann erschwert werden durch auto-boxing und Objekt-ähnlichen Kontexten in verschiedenen Sprachen, aber die Allgemeinen Ideen ist, dass der variable Wert IST der tatsächliche Wert, dargestellt durch das symbol für die variable sondern einen Zeiger auf einen anderen Speicherbereich.
Funktionsargumente und-Parameter sind nicht das gleiche. Auch, den Wert einer variable wird nicht die variable, die das Objekt (wie schon von verschiedenen Leuten, aber scheinbar ignoriert). Diese Unterscheidungen sind wichtig, um das richtige Verständnis.
Pass-by-value oder Call-by-sharing (für Objekte): Die Funktion-argument ist der Wert zu einem anderen KOPIERT Speicherbereich, auf den verwiesen wird, durch die Funktion s-parameter-symbol (unabhängig davon, ob es auf dem stack oder heap). In anderen Worten, die Funktion parameter erhalten Sie eine Kopie des übergebenen Arguments ' s Wert... UND (kritische) das argument der Wert nicht mehr AKTUALISIERT /VERÄNDERT /GEÄNDERT durch die aufrufende Funktion. Denken Sie daran, eine object-variable, die den Wert ist NICHT das Objekt selbst, sondern es wird der Zeiger auf das Objekt, also die übergabe einer Objekt-variable per Wert kopiert den Zeiger auf die Funktion parameter-variable. Der parameter der Funktion ist der Wert der Punkte, die genau die gleiche Objekt im Speicher. Die Daten des Objekts selbst verändert werden können, direkt über der parameter der Funktion, SONDERN die Funktion-argument IST der Wert nicht AKTUALISIERT, also es wird weiterhin auf die gleichen Objekt, während und natürlich auch nach dem Aufruf der Funktion (auch wenn Ihr Objekt die Daten geändert wurde oder wenn der parameter der Funktion zugewiesen ist, ein anderes Objekt insgesamt). Es ist falsch, daraus zu folgern, dass die Funktion ein argument per Referenz übergeben, nur weil das referenzierte Objekt ist aktualisierbar über die Funktion parameter-variable.
Call /Pass-by-reference: Die Funktion-argument Wert ist, kann/wird direkt aktualisiert werden, indem die entsprechende Funktion parameter. Wenn es hilft, der parameter der Funktion wird ein wirksames "alias" für das argument--Sie effektiv beziehen sich auf den gleichen Wert an der gleichen Speicherstelle. Wenn eine Funktion ein argument ist ein Objekt variable, die Fähigkeit, zu ändern die Daten des Objekts ist nichts anderes als die pass-by-value, da der parameter der Funktion wird immer noch auf das gleiche Objekt als argument. Aber in der Objekt-variable Fall, wenn die Funktion der parameter gesetzt, um ein völlig anderes Objekt, dann das argument wird ebenso auch auf die verschiedenen Objekt-das passiert nicht in der pass-by-value case.
JavaScript nicht pass-by-reference. Wenn Sie Lesen Sie eng, werden Sie erkennen, dass alle konträren Meinungen falsch verstehen, was damit gemeint ist pass-by-value und Sie fälschlicherweise den Schluss, dass die Möglichkeit der Aktualisierung von Daten eines Objekts mittels der parameter der Funktion ist ein Synonym für die "pass-by-value".
Objekt Klonen/kopieren: Ein neues Objekt wird erstellt, und das ursprüngliche Objekt werden die Daten kopiert. Dies kann eine Tiefe Kopie oder flache Kopie, aber der Punkt ist, dass ein neues Objekt erstellt wird. Erstellen einer Kopie eines Objekts ist ein separates Konzept von pass-by-value. Einige Sprachen unterscheiden zwischen Klasse, Objekt und Strukturen (oder ähnliches), und kann verschiedene Verhalten für die übergabe von Variablen der verschiedenen Typen. Aber JavaScript nicht irgend etwas tun, wie dies automatisch beim übergeben von Objekt-Variablen. Aber das fehlen von automatischen Objekt Klonen nicht übersetzen, pass-by-reference.
InformationsquelleAutor C Perkins
Meine einfachen Weg, dies zu verstehen...
Wenn Sie eine Funktion aufrufen, übergeben Sie den Inhalt (Referenz-oder
Wert) der argument-Variablen, nicht die Variablen selbst.
Innerhalb der Funktion parameter-Variablen,
inVar1
undinVar2
, erhalten Sie den Inhalt übergeben wird.Seit
inVar2
erhielt die Referenz der{ prop: 2 }
Sie können den Wert der Objekteigenschaft.InformationsquelleAutor dpp
In eine low-level Sprache, wenn Sie möchten, übergeben Sie eine variable per Referenz müssen Sie eine bestimmte syntax bei der Erstellung der Funktion:
Den
&age
ist ein Verweis aufmyAge
, aber wenn Sie möchten, dass der Wert, den Sie konvertieren die Referenz, mit*age
.Javascript ist eine high-level Sprache, die diese Konvertierung für Sie.
So, auch wenn die Objekte werden per Referenz übergeben, der die Sprache umwandelt, die Referenz-parameter auf den Wert. Sie brauchen nicht zu verwenden
&
auf die definition der Funktion, um es zu übergeben, die durch Verweis, weder*
auf die Funktion Körper, konvertieren die Referenz auf den Wert, JS tut es für Sie.Das ist, warum, wenn Sie versuchen, sich zu ändern, ein Objekt innerhalb einer Funktion, indem es den Wert (d.h.
age = {value:5}
), wird die änderung nicht beibehalten, aber wenn Sie es ändern Sie die Eigenschaften (D. H.age.value = 5
), tut es.Erfahren Sie mehr
InformationsquelleAutor Narayon
Gelesen habe ich über diese Antworten mehrmals, aber nicht kapiert, bis ich gelernt, über die technische definition von "Call-by-sharing" als als von Barbara Liskov
Ist, parameter Verweise sind veränderbar, wenn Sie gehen, und den Zugriff auf die parameter ein Wert an sich. Auf der anderen Seite, die Zuweisung zu einem parameter wird verschwinden, nach der Bewertung, und ist nicht zugänglich für die Funktion Anrufer.
InformationsquelleAutor steviejay
Für die Programmiersprache Anwälte, ich habe ging durch die folgenden Abschnitte zu ECMAScript 5.1 (die ist leichter zu Lesen als die neueste Auflage), und gehen so weit wie Fragen es auf der ECMAScript-mailing-Liste.
TL;DR: Everythings sind durch Wert übergeben, sondern Eigenschaften von Objekten, die Referenzen sind, und die definition des Objekts ist gruselig fehlen in der Norm.
Bau der Argument-Listen
Abschnitt 11.2.4 "Argumente" sagt Folgendes über die Herstellung einer Argumentliste, bestehend aus nur 1 argument:
Abschnitt auch auflisten von Fällen, in denen argument-Liste hat 0 oder >1 Argumente.
Also alles, was der Verweis übergeben werden.
Zugriff von Objekt-Eigenschaften
Abschnitt 11.2.1 "Eigenschaftenaccessoren"
So, Eigenschaften von Objekten sind immer verfügbar als Referenz.
Auf Referenz
Es ist beschrieben im Abschnitt 8.7 "Der Referenz-Spezifikation Typ", die Referenzen sind keine echten Typen in der Sprache - Sie werden nur verwendet, um zu beschreiben, das Verhalten der löschen, der typeof-und Zuweisungsoperatoren.
Definition von "Objekt"
Definiert, 5.1 edition, dass "Ein Objekt ist eine Sammlung von Eigenschaften". Daher können wir folgern, dass der Wert des Objekts ist die Sammlung, aber was ist der Wert der Sammlung ist schlecht definiert in der Spezifikation, und erfordert ein bisschen Aufwand zu verstehen.
InformationsquelleAutor DannyNiu
Dies ist etwas mehr Erklärung für die wertübergabe und die referenzübergabe (Javascript). In diesem Konzept, das Sie sprechen, übergeben Sie die variable per Referenz übergeben Sie die variable per Referenz.
Pass-by-value (Primitive Type)
Übergabe per Referenz (die Objekte)
Speziellen Fall, übergabe per Referenz (die Objekte)
c
festgelegt ist, um eine Kopie des neuen Objekts verweisen.InformationsquelleAutor Ashish Singh Rawat
Die prägnanteste Erklärung, die ich fand, war in der Style guide-AirBNB:
Primitive: Wenn Sie auf eine primitive Art arbeiten Sie direkt auf Ihrer
Wert
E. g.:
Komplexe: Wenn Sie auf eine komplexe Art der Arbeit auf eine Referenz, um seinen Wert
E. g.:
I. e. effektiv primitive Typen werden als Wert übergeben, und komplexe Typen per Referenz übergeben.
InformationsquelleAutor lid
Einen einfachen Weg, um zu bestimmen, ob etwas ist "pass by reference" ist, ob Sie schreiben, ein "swap" - Funktion. Zum Beispiel in C, die Sie tun können:
Wenn Sie nicht tun können, das äquivalent von, dass in Javascript, es ist kein "pass by reference".
Noch einfacher ist, dass alles, was übergeben wird, durch den Wert in JavaScript.
stackoverflow.com/questions/42045586/...
InformationsquelleAutor Ross
Habe ich die verlängern Methode der Underscore.js Bibliothek sehr nützlich, wenn ich will, zu übergeben, die ein Objekt als parameter entweder modifiziert oder vollständig ersetzt.
InformationsquelleAutor Jack
InformationsquelleAutor uriz
Ich würde sagen, es ist pass-by-copy -
Betrachten die Argumente und Variablen der Objekte sind Objekte geschaffen, die während der Ausführung Kontext erstellt, in der Anfang der Funktions-Aufruf - und Ihr tatsächlicher Wert/Referenz an die Funktion übergeben bekommen nur gespeichert diese Argumente + variable Objekte.
Einfach gesprochen, für die primitiven Datentypen werden die Werte kopiert, die Anfang der Funktionsaufruf für den Objekt-Typ, wird die Referenz kopiert.
InformationsquelleAutor lyslim
MDN docs klar erklären, ohne allzu wortreich:
Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Description
InformationsquelleAutor miguelr
In einigen Fällen kann dies hilfreich sein, zu ändern
anArg
:InformationsquelleAutor lefakir
von Wert.
Array und Objekt übergeben, wie pass by reference oder pass-by-value basiert auf diesen zwei Bedingungen.
wenn Sie ändern den Wert des Objekts oder Arrays mit new Object oder Array, dann ist es Wert übergeben.
object1 = {item: "car"};
array1=[1,2,3];
hier bei der Zuweisung einer neuen Objekt oder array zu alt.ändern Sie nicht den Wert des Eigentums
der alte Objekt.so ist es als Wert übergeben.
wenn Sie ändern den Wert einer Eigenschaft von einem Objekt oder array, dann ist es pass-by-Reference.
object1.key1= "car";
array1[0]=9;
sind Sie hier ändern einer Eigenschaft mit dem Wert des alten Objekts.Sie sind nicht die Zuordnung neuer Objekt oder array zu alt.so ist es pass-by-reference.
Code
Nein, alles ist immer durch Wert übergeben. Es hängt nur davon ab, was Sie auf der Durchreise sind (ein Wert oder eine Referenz). Siehe this.
InformationsquelleAutor Mukund Kumar
Primitiven Wert übergeben werden und die Objekte werden per Referenz übergeben. Dies ist ganz anders aus anderen Sprachen wie C, VB oder Delphi. Ich kann nicht sagen, wie Sie den Umgang mit Objekten und primitiven genau, aber ich weiß von VB und Delphi, die es können (und sollten) angegeben werden.
php macht etwas ähnliches, seit der version 5: alle Objekte werden per Referenz übergeben, aber alle primitive kann per Referenz übergeben werden, wenn vorangestellt, die durch ein kaufmännisches und-Zeichen (&). Ansonsten primitiven Wert übergeben werden.
So, in javascript, wenn ich übergeben Sie ein Objekt X in eine Funktion über einen parameter, es werden noch X. Wenn Sie das ändern von Daten innen wird die Funktion (oder einem anderen Objekt, aber das ist nicht wichtig), der neue Wert ist, auch außerhalb der Funktion.
ändern Sie Ihren code so
var x = {hi : 'hi'}; change(x); console.log(x.hi); function change(x) { x.hi = 'changed'; }
ändert sich das Verhalten.stackoverflow.com/questions/42045586/...
InformationsquelleAutor
Einfache Werte innerhalb der Funktion wird sich nicht ändern diese Werte außerhalb der Funktion (Sie werden übergeben durch Wert), in der Erwägung, dass komplexe wird (Sie werden per Referenz übergeben).
Nein, alles ist immer durch Wert übergeben. Es hängt nur davon ab, was Sie auf der Durchreise sind (ein Wert oder eine Referenz). Siehe this.
InformationsquelleAutor Olivera Kovacevic