Сделать объект не передаваемым по ссылке

Я только что узнал, что сложные объекты передаются по ссылке в 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();,

.toSource на MDN

Другие вопросы по тегам