Question

Je viens de découvrir à la dure que les objets sont passés par référence en Javascript, par exemple :

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';
}

Cela modifiera la valeur dans tempValues ​​et hudLayers.(Cela semble évident, mais un message sans un peu de code semble tellement nu.)

Existe-t-il un moyen rapide de contourner ce problème ?

Était-ce utile?

La solution

Ce n'est pas un exemple de passage par référence (vous ne transmettez aucun paramètre). Cependant, vous êtes correct;L'attribution d'un objet ne fera pas une copie profonde.

Vous pouvez faire une copie profonde d'un objet comme celui-ci:

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;
}

Notez que si le constructeur d'un objet a des effets secondaires, ce code les déclenchera.

Autres conseils

Il n'y a pas de passage par référence en JavaScript.Les objets sont accessibles par des références et ces références sont attribuées ou transmises passues par la valeur, comme dans Java

Faire une copie complète d'un objet est aussi simple que objCopy = obj.toSource();.

.toSource sur MDN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top