Сделать объект не пройти через ссылку
-
17-09-2020 - |
Вопрос
Я только что обнаружил, что объекты жесткого пути передаются ссылкой в 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. (Кажется видом очевидным, но пост без немного кода кажется настолько голым.)
есть быстрый путь вокруг этого?
Решение
Это не пример прохождения посредством ссылки (вы не проходите никаких параметров). Тем не менее, вы правы;Присвоение объекта не сделает глубокую копию.
Вы можете сделать глубокую копию объекта, как это:
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();
.