Working on a NodeJS project, I came a across this very unexpected behaviour that I can't figure a way around - it seems like a bug to me, but perhaps I'm simply misunderstanding how NodeJS modules operate.
I've reduced it into a testcase as follows:
mod.js module
exports.process = function(obj) { obj.two = 'two'; };
test.js file
var testObj = {one: 'one'}; console.log(['Before:', testObj]); var cachedObj = testObj; require('./mod').process(cachedObj); console.log(['After:', testObj]);
Then running $ node test.js
gives me this:
[ 'Before:', { one: 'one' } ] [ 'After:', { one: 'one', two: 'two' } ]
I'm assigning the value of testObj
to cachedObj
, and testObj
is never being passed to the module method. testObj
should (as far as I can see) never be modified at all.
In fact, cachedObj
should surely never be modified either, as it is never returned from the mod.process
method. Where am I going wrong?
(running Node 0.6.9)
cachedObj
andtestObj
refers to the same object literal, so if you modify one variable, it is of course seen in both since the variables are just aliases referring to the same object.Also, objects are passed by reference in JavaScript, so if you modify it inside process.js, the object will be modified.
Objects are passed by reference.
Since
cachedObj
andtestObj
point to the same object (cachedObj === testObj
istrue
), modifying a property ofcachedObj
will also result in a modifiedtestObj
.It's not a bug, it's perfectly expected behavior.
Variables in JavaScript are passed by reference, so the original object is mutated by the assignment in
process
.