Faça com que o objeto não passe por referência
-
17-09-2020 - |
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?
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();
.