Pergunta

Acabei de descobrir a maneira mais difícil de passar objetos por referência em Javascript, por exemplo:

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

Isso alterará o valor em tempValues ​​e hudLayers.(Parece meio óbvio, mas uma postagem sem um pouco de código parece tão simples.)

Existe uma maneira rápida de contornar isso?

Foi útil?

Solução

Este não é um exemplo de passagem por referência (você não está passando nenhum parâmetro).No entanto, você está correto;atribuir um objeto não fará uma cópia profunda.

Você pode fazer uma cópia profunda de um objeto como este:

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

Observe que se o construtor de um objeto tiver algum efeito colateral, este código irá acioná-lo.

Outras dicas

Não há passagem por referência em JavaScript.Os objetos são acessados ​​​​por meio de referências e essas referências são atribuídas ou passadas por valor, assim como em Java

Fazer uma cópia profunda de um objeto é tão simples quanto objCopy = obj.toSource();.

.toSource no MDN

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top