Rendere l'oggetto non passare per riferimento
-
17-09-2020 - |
Domanda
Ho appena scoperto che gli oggetti hard way sono passati per riferimento in JavaScript, ad esempio:
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';
}
.
Ciò cambierà il valore in tempvalue e hudlayers. (Sembra un tipo di ovvio, ma un post senza un po 'di codice sembra così nudo.)
C'è un modo rapido intorno a questo?
Soluzione
Questo non è un esempio di passaggio per riferimento (non stai passando alcun parametro). Tuttavia, sei corretto;L'assegnazione di un oggetto non creerà una copia profonda.
Puoi creare una copia profonda di un oggetto come questa:
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;
}
.
Si noti che se il costruttore di un oggetto ha effetti collaterali, questo codice li attiverà.
Altri suggerimenti
Non c'è passaggio per riferimento in JavaScript.Gli oggetti sono accessibili tramite riferimenti e tali riferimenti sono assegnati o passati superati per valore, proprio come in Java
Fare una copia profonda di un oggetto è semplice come objCopy = obj.toSource();
.