Javascript Pointer / Verrücktheit der Referenz. Kann jemand das erklären?

Javascript übergibt Objekte by reference. Das macht auch Sinn. Aber sobald Sie anfangen, die Manipulation dieser Objekte, alles wirkt in einer Weise, die scheinen unintuitiv. Lassen Sie mich ein Beispiel geben:

var a, b;

a = {}
b = a;
a['one'] = {};

console.log( JSON.stringify(a) );
//outputs: {"one":{}}

console.log( JSON.stringify(b) );
//outputs: {"one":{}}

Das ist ja alles schön und gut, weil jetzt b hat einen Zeiger auf a es ist also zu erwarten, dass die Zuordnung von Sachen zu a wird auch Auswirkungen auf b.

Aber dann, wenn ich dies tun:

a = a['one'];

console.log( JSON.stringify(a) );
//outputs: {}

console.log( JSON.stringify(b) );
//outputs: {"one":{}}

Dies ist für mich überraschend. Ich würde erwarten, dass a und b noch die gleichen (und werden {} seit a['one'] vorher festgelegt wurde, um {} und a war a['one']).

Aber das ist nicht der Fall. Es scheint, dass a verliert seine Referenz zu b wenn es zugeordnet ist, etwas neues, aber b behält den Wert, der a festgelegt wurde vor a verlieren Ihren Bezug zu b.

Aber dann, wenn ich dies tun:

a['two'] = 2;

console.log( JSON.stringify(a) );
//outputs: {"two":2}

console.log( JSON.stringify(b) );
//outputs: {"one":{"two":2}}

Was? a hat klar verloren Verweis auf b, aber b scheint, haben noch einige Verweis auf a.

Nicht das leere Objekt {} Punkt an eine andere Stelle im Speicher, so dass jede variable, die darauf verweisen, zeigt jetzt auf den gleichen Platz?

Kann jemand mit einem festen Griff auf das, erklär es mir?

Kommentar zu dem Problem - Öffnen
"jetzt b ist ein Zeiger auf a" ist, wo die Unwahrheit beginnt. "jetzt b Punkte auf derselben Stelle wie a" ist der fix. Kommentarautor:
"Javascript übergibt Objekte per Referenz" - Nein, das geht nicht. Es geht durch den Wert aber in dem Fall von Objekten, die übergebene Wert ist eine Referenz auf das Objekt und keine Kopie des Objekts selbst. Dies ist eine wichtige Unterscheidung. Es macht nicht wirklich Sinn machen, darüber reden, die "Weitergabe" von Werten oder Referenzen, wenn Sie reden nicht über die Parameter der Funktion, aber trotzdem: wenn es per Referenz übergeben, dann könnte man ändern, was für ein Objekt die ursprünglichen Variablen a zeigt an, indem Sie das verändert, was die zweite variable b zeigt auf - was Sie definitiv nicht tun (ob in einer Funktion oder nicht). Kommentarautor: nnnnnn
@Seth Carnegie: "Pass by reference" ist ein standard-nicht-Sprache-Programmierung, Begriff, der eine Reihe von Sprachen unterstützt, ohne dass der Programmierer Zeiger, aber JavaScript tut dies nicht. Was Sie gesagt haben, richtig ist: "passing a reference by value" ist, was passiert mit JavaScript-Objekten. Ich entschuldige mich, dass ich es nicht geschafft zu sagen, dass zuvor. Ich denke, wir haben im Kreise herum durch die Terminologie, sorry. Kommentarautor: nnnnnn
Danke @nnnnnn das macht eine Menge von Terminologie-Fragen, die ich hatte. Kommentarautor: Philip Walton

InformationsquelleAutor der Frage Philip Walton | 2011-11-29

Schreibe einen Kommentar