Make object not pass by reference
I just found out the hard way objects are passed by reference in Javascript, for example:
for(var layer = 0; layer < hudLayers['layers'].length; layer++){
// Store the to-be-calculated values in this object
var tempValues = hudLayers['layers'][layer];
tempValues['name'] = 'test';
}
开发者_开发知识库This will change the value in tempValues and hudLayers. (Seems kind of obvious, but a post without a bit of code seems so naked.)
Is there a quick way around this?
This is not an example of passing by reference (you aren't passing any parameters). However, you're correct; assigning an object will not make a deep copy.
You can make a deep copy of an object like this:
function deepCopy(obj) {
if (typeof obj !== "object") return obj;
if (obj.constructor === RegExp) return obj;
var retVal = new obj.constructor();
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
retVal[key] = deepCopy(obj[key]);
}
return retVal;
}
Note that if an object's constructor has any side-effects, this code will trigger them.
There is no pass by reference in JavaScript. Objects are accessed through references and those references are assigned or passed passed by value, just like in Java
Making a deep copy of an object is as simple as objCopy = obj.toSource();
.
.toSource on MDN
精彩评论