2017-06-13 76 views
0

這有點奇怪。我確定我錯過了一些編程的基本概念,但不知道最新的是什麼。因爲直到現在我從來沒有面對過這個問題。第二次調用常規方法時,對象值被覆蓋

讓我通過編程解釋一下我的問題:

var result = {abc: 10, cde: 20, efg: 30}; 
var final_result = {}; 
var customFunction1 = function(results){ 
    console.log(results); 
    return results; // result= {abc: 10, cde: 20, efg: 30} 
}; 
var customFunction2 = function(results){ 
results.cde = 100; 
results.efg = 500; 
return results; // {abc: 10, cde: 100, efg: 500} 
}; 
final_result.result1 = customFunction1(result); 
final_result.result2 = customFunction2(result); 
console.log(final_result); 

在上面的程序中,我傳遞的結果參數的功能,和存儲在它「final_result.result1」的返回值。 但是,當我使用相同的參數調用不同的函數時,這會被覆蓋。 什麼我得到的輸出是:

{ 「RESULT1」:{ 「ABC」:10, 「CDE」:100, 「EFG」:500}, 「結果2」:{ 「ABC」:10 「CDE」:100, 「EFG」:500}}

預期O/p是: { 「RESULT1」:{ 「ABC」:10, 「CDE」:20, 「EFG」:30 },「result2」:{「abc」:10,「cde」:100,「efg」:500}}

爲什麼final_result.result1的值被result.result2覆蓋。

JSBin http://jsbin.com/mepizecuka/edit?js,console 
Plunkr http://plnkr.co/edit/BF0UNnacV9UeXtyk3stI?p=preview 

任何人都可以請幫我這裏。

+0

http://jsbin.com/gofakajiqe/edit?js,console預期輸出是我看到的唯一輸出。另外這可能有助於https://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference – bassxzero

+0

讓我添加屏幕截圖和或plunkr – undefined

+0

沒有必要添加屏幕截圖或plunkr。根據您提供的代碼獲得預期結果,如我的jsbin鏈接所示。如果您提供的代碼沒有產生錯誤,那麼這可能是其他問題,或者您需要更新問題中的代碼。 – bassxzero

回答

0

有沒有能力把同一對象傳遞給同一個參照,並在參照後改變它。讓我用一個例子來解釋它。

var obj = {a:100}; 
 
var holder = {}; 
 
function changeValues(object) 
 
{ 
 
    object.a = 5; 
 
} 
 
console.log(JSON.stringify(obj)); 
 
holder.test = obj; // our object is same with holder.test now. 
 
holder.test2 = obj;// our object is same with holder.test2 now. 
 
// holder.test = holder.test2 now; 
 

 
changeValues(holder.test); 
 
console.log(JSON.stringify(obj));

如果你想通過和改變全球化志願服務青年,那麼你可以克隆它。

var obj = {a:100}; 
 
    var holder = {}; 
 
    function changeValues(object) 
 
    { 
 
     object.a = 5; 
 
    } 
 
    console.log(JSON.stringify(obj)); 
 
    holder.test = jQuery.extend({}, obj); // our object is cloned now; 
 
    holder.test2 = obj;// our object is same with holder.test2 now. 
 
    // holder.test != holder.test2 now; 
 

 
    changeValues(holder.test); 
 
    console.log(JSON.stringify(obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

現在,你必須在holder.test不同的對象......

0

我沒有看到代碼的任何問題在這裏。

這是JavaScript工作的方式(或大部分的語言工作,當參數傳遞參數時)。

您的初始result是一個對象,它是JavaScript中的一個引用類型。這意味着相同的(單個)引用將傳遞到您的所有函數。

讓我們假設您的result對象在內存中某處被分配了引用A。 因此,當您通過result第一個功能,其傳遞的參考A。這裏你沒有改變它,返回的輸出仍然指向A,值也是相同的。您將相同的參考A分配給final_results.result1

此後,您將結果傳遞給function2,這意味着現在將相同的參考A傳遞給function2。這次你改變了很少的值。這意味着參考值正在改變,並且在使用參考時無處不在。接下來,您將輸出分配給final_results.result2

現在您有一個final_result obj,其中包含2個屬性,實質上這2個屬性指的是相同的內存引用A。這就是在你的第二次函數調用之後都被改變的原因。

在簡而言之:太在JS對象和陣列通過引用傳遞,而其它類型的像numberstring由值來傳遞。因此,如果result最初是一個原語(例如數字,如var result = 20),則不會看到相同的問題。

關於處理這個問題的解決方案,@Burak已經向您展示了一種方法。還有其他人。也許你應該找到它們。

+0

「其通過的參考A」對象的通過**複製**通過參考不通過參考。 – bassxzero

相關問題