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)
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.
Objects are passed by reference.
var testObj = {one: 'one'}; // <--- Object
var cachedObj = testObj; // cachedObj and testObj point to the same object,
Since cachedObj and testObj point to the same object (cachedObj === testObj is true), modifying a property of cachedObj will also result in a modified testObj.
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