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?

È stato utile?

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();.

.tosource su MDN

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top