2010-07-19 43 views
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值。 (看起來很明顯,但沒有一點代碼的帖子看起來很裸體)。

有沒有快速解決這個問題的方法?

+1

您想爲'tempValues'指定一個值並使它不會反映在'hudLayers'中?你爲什麼要這樣? – 2010-07-19 19:30:56

+0

你真的想知道嗎? :) 'hudLayers'包含圖像寬度和高度的幾個變量。這是一個HUD,因此必須每秒繪製多次。 「hudLayers」中的內容實際上就是「藍圖」(基於該變量值的圖像寬度,...) 如果我簡單地將它寫回'hudLayers',藍圖就消失了,屏幕上的圖像將永遠保持不變。 – skerit 2010-07-19 19:53:01

回答

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

需要注意的是,如果一個對象的構造有任何的副作用,此代碼將觸發它們。

-1

製作對象的深層副本就像objCopy = obj.toSource();一樣簡單。

.toSource on MDN

+1

我想'toSource'返回一個字符串表示。可以設置一個測試用例嗎? – kapa 2012-02-07 08:53:29

0

沒有通通過在JavaScript參考。對象通過引用進行訪問,並且這些引用被賦值或通過值傳遞,就像在Java中一樣。