2014-07-17 80 views
1

我知道Javascript的對象是通過對函數的引用副本傳遞的。Javascript - 通過引用傳遞返回修改的對象

從這個意義上講,如果我有一個修改對象的函數,我是否應該返回對象並覆蓋原始對象?

即,這

function inc(obj) 
{ 
    obj.count++; 
} 

obj = {count : 0, topic : 'Something'}; 
inc(obj); 

VS此:

function inc(obj) 
{ 
    obj.count++; 
    return obj; 
} 

obj = {count : 0, topic : 'Something'}; 
obj = inc(obj); 

哪一個更好,爲什麼?

+1

如果你已經知道JS複製了一個引用,以便你的函數在原始對象上運行,那麼爲什麼你認爲它會有所作爲?你的問題似乎任意。這就像說:「我知道1 + 2會產生與2 + 1相同的結果,所以我應該使用哪個順序?」* –

+0

「更好」?按什麼標準? – RobG

回答

2

如果函數返回傳入的值,那麼確實沒有意義 - 在任何情況下,函數都不能更改外部變量「obj」的值。

說JavaScript中的任何內容都是「通過引用傳遞」並不完全正確。對象「值」是總是引用,並且參數傳遞也不例外。 JavaScript是嚴格按照價值傳遞的語言;只是碰巧引用對象的值就是引用對象。所以你在問題開頭說的是正確的:對象的引用副本被傳遞給函數。參數傳遞的話題是簡單而複雜的,並且在技術「語言理論」術語「傳遞參考」中出現「參考」一詞這一事實並不複雜。

現在,在某種情況下,由於某種原因,您的函數可能會決定需要創建一個新的對象,然後返回一個對象可能是有意義的。

+0

對不起,我的第二個案件的錯誤。我的意思是增加計數,然後返回整個對象。請參閱上文。 – Kousha

+0

@Kousha確定我會更新答案。 – Pointy

+0

好的,謝謝,這樣做更有意義。每當定時器用完時我都會投這個票。 – Kousha