The basic example:
var b = 10;
var c = b;
b++;
console.log(b,c);
>> 11 10
c looks like a copy of b.
But in another case:
var x = {};
var y = x;
x.abc = 10;
console.log(x.abc, y.abc);
>> 10 10
Why is the y not a copy of x, but a reference which points to the same instance x points to?
Also, I guessed b++ creates another instance, so b points to the new instance but c points to the old one. However...
var u = 10;
setTimeout(function() {
console.log(u);
}, 10000)
u++;
>> 11
If u++ creates a new instance, then the u inside the anonymous function should point to the old u, shouldn't it?
When primitives are assigned, they are assigned by value; references types (like your object) are assigned by reference (or, as Jon Skeet corrects me, they're assigned a copy of the reference).
In your second example x and y both point to the same object in memory. That's why adding an abc property to one, also adds it to the other
You'd also observe the same behavior passing x or y into a function
function addABC(foo) {
foo.abc = 10;
}
var x = {};
var y = x;
addABC(x);
console.log(x.abc, y.abc);
Just note that, though x and y point to the same object in memory, they're separate copies of the reference, so this
var x = { a: 1 };
var y = x;
y = {};
alert(x.a);
and this
var x = { a: 1 };
var y = x;
x = {};
alert(y.a);
will still alert 1.
the
clooks like a copy ofb.
Both are references to the same immutable value.
Why the
yis not copy ofxbut a reference which points to the instancexpoints to?
x was a reference to an object in the first place, so y is a copy of it (a copy of the reference, not a copy of the object).
If
u++creates a new instance,
It doesn't.
the
uin anonymous function should points to the oldu, shouldn't it?
u++ assigns a reference to 11 to u. The anonymous function is looking at u and not "the value of u at the time the function was created".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With