4

我刚刚发现在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 中的值。(似乎有点明显,但没有一点代码的帖子似乎很赤裸裸。)

有没有快速解决这个问题的方法?

4

3 回答 3

6

这不是通过引用传递的示例(您没有传递任何参数)。但是,您是对的;分配对象不会进行深层复制。

您可以像这样对对象进行深层复制:

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

请注意,如果对象的构造函数有任何副作用,则此代码将触发它们。

于 2010-07-19T19:28:19.880 回答
0

JavaScript 中没有引用传递。对象是通过引用访问的,这些引用是通过值分配或传递的,就像在 Java 中一样

于 2012-02-07T09:06:46.420 回答
-1

制作对象的深层副本就像objCopy = obj.toSource();.

.toSource 在 MDN 上

于 2012-02-06T22:38:01.187 回答