Сделать объект не передаваемым по ссылке
Я только что узнал, что сложные объекты передаются по ссылке в Javascript, например:
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';
}
Это изменит значение в tempValues и hudLayers. (Кажется очевидным, но пост без кода кажется таким голым.)
Есть ли быстрый способ обойти это?
3 ответа
Решение
Это не пример передачи по ссылке (вы не передаете никаких параметров). Тем не менее, вы правы; назначение объекта не сделает глубокую копию.
Вы можете сделать глубокую копию объекта следующим образом:
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;
}
Обратите внимание, что если у конструктора объекта есть побочные эффекты, этот код вызовет их.
В JavaScript нет передачи по ссылке. Доступ к объектам осуществляется через ссылки, и эти ссылки назначаются или передаются по значению, как в Java
Создание глубокой копии объекта так же просто, как objCopy = obj.toSource();
,