Сделать объект не передаваемым по ссылке - PullRequest
4 голосов
/ 19 июля 2010

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

6 голосов
/ 19 июля 2010

Это не пример передачи по ссылке (вы не передаете никаких параметров).Тем не менее, вы правы;Присвоение объекта не сделает глубокую копию.

Вы можете сделать глубокую копию объекта следующим образом:

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;
}

Обратите внимание, что если конструктор объекта имеет какие-либо побочные эффекты, этокод вызовет их.

0 голосов
/ 07 февраля 2012

В JavaScript нет передачи по ссылке.Доступ к объектам осуществляется через ссылки, и эти ссылки присваиваются или передаются по значению, как в Java

0 голосов
/ 07 февраля 2012

Создание глубокой копии объекта так же просто, как objCopy = obj.toSource();.

.toSource для MDN

...