Friday, May 10, 2024
 Popular · Latest · Hot · Upcoming
5
rated 0 times [  11] [ 6]  / answers: 1 / hits: 25165  / 13 Years ago, tue, november 29, 2011, 12:00:00

Javascript passes objects by reference. This makes perfect sense. But once you start manipulating those objects, everything acts in a way that seem unintuitive. Let me offer an example:



var a, b;

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

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

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


This is all well and good because now b has a pointer to a so it's expected that assigning stuff to a will also affect b.



But then if I do this:



a = a['one'];

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

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


This is surprising to me. I'd expect a and b to still be the same (and to be {} since a['one'] was previously set to {} and a was set to a['one']).



But that's not the case. It appears that a loses its reference to b when it's assigned to something new, but b maintains the value that a was set to prior to a loosing its reference to b.



But then if I do this:



a['two'] = 2;

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

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


What? a has clearly lost it's reference to b, but b seems to still have some reference to a.



Does the empty object {} point to some place in memory so every variable referencing it is now pointing to the same place?



Can someone with a firm grasp on this explain it to me?


More From » pointers

 Answers
70

Following your example line by line:



a = {}


a now references the new object.



b = a;


b now references the same object that a references. Note that it does not reference a.



a['one'] = {};


The new object now has an index 'one' that references another new object.



When you do



a = a['one'];


You are setting a to refer to a['one'], which is that new object you created when you did a['one'] = {}. b still references the object you created with a = {}.



You are confusing the issue when you say a has lost its reference to b because a does not refer to b , nor vice versa. a and b refer to objects, and they can be made to refer to other objects. Like this:



With a = {}; b = a, you get



a


{ }
/
/
b


Then with a['one'] = {} you get



a


{ one: { } }
/
/
b


Then with a = a['one'] you get



a - - - - 

{ one: { } }
/
/
b

[#88839] Monday, November 28, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
wilson

Total Points: 27
Total Questions: 93
Total Answers: 93

Location: Tajikistan
Member since Sun, Aug 29, 2021
3 Years ago
wilson questions
Tue, Aug 9, 22, 00:00, 2 Years ago
Wed, May 11, 22, 00:00, 2 Years ago
Wed, May 20, 20, 00:00, 4 Years ago
Wed, May 13, 20, 00:00, 4 Years ago
;