Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top