2012-07-17 133 views
4

在我的應用程序中,當我將它傳遞給不同的對象時,我不確定是否複製數據。正如一個例子看看下面的代碼:Javascript:通過引用傳遞對象

var DataStore = function(data) { 
    this.data = data; // <-- typeof data === 'object' 
} 

var Controller = function() { 
    var dataStore = new DataStore({foo: 'bar'}); 
    var plugin = new Plugin(dataStore.data); 
} 

var Plugin = function(data) { 
    this.data = data; 
} 

var app = new Controller(); 

當我創建插件它傳遞數據屬性從dataStore。然後將其分配給Plugin內的屬性。請記住,傳遞的數據是一個對象,我的問題是,這是在內存中創建兩個變量,還是Plugin中的data屬性引用DataStore對象中的屬性?

如果在賦值之後沒有保留引用,我該如何將DataStore傳遞到插件並在本地保存對它的引用?或者我需要將DataStore作爲全局變量保存在我的應用程序範圍中,並從插件全局引用它?

+0

AFAIK JavaScript對象總是引用 – 2012-07-17 05:25:50

+3

@AlvinWong不太。像JavaScript這樣的ECMAScript實現中的對象只能通過引用來訪問,而對象引用則是可以賦值的*值*。從其他編程語言*中已知的引用調用*不存在*,它總是*按值調用。這與例如Java中的相同。 – PointedEars 2012-07-17 05:32:37

回答

11

兩個dataStore.dataplugin.data引用相同的對象 - 變異在任這些「類」的對象(因爲缺乏一個更好的詞)將導致對象被突變對他們倆的(因爲它們都抱着引用同一個對象)。

+2

這是正確的,可能是未來Google員工所需的實用信息。雖然這裏的其他答案/評論列出了爲什麼javascript實際上不是「通過引用調用」的技術原因,但它在處理對象參數時仍然表現得與程序員的角度非常相似。另外,我還會補充一點,如果你不希望出現這種行爲,你需要做如下的事情(使用jQuery,但是每個庫都有它自己的實現)'var copy = $ .extend(true, {},data);'然後傳遞'copy'而不是'data' – 2012-12-05 11:50:34

0

函數參數總是通過引用在JS中傳遞。當你傳遞一個對象作爲參數時,通過的對象實際上是一個指針到對象在內存中的位置。如果您嘗試覆蓋引用本身,則原始對象不會發生任何變化,但是如果您更改了任何對象屬性的值,則原始對象將被修改。

例:

function f1(_x) { 
    _x = 5; 
} 

function f2(_y) { 
    _y.name = 'Hello'; 
} 

var x = 10; 
f1(x); 
console.log(x); // no change to x 

var y = {name: 'Tom'}; 
f2(y); 
console.log(y.name); // y.name is now Hello 
+0

不,沒有「JS中的傳遞引用」,函數參數與其他值沒有區別。在語言層面沒有指針(可能在執行級別,但沒有指定)。參考不會被覆蓋,參數值是,參數對於函數是局部的。 – PointedEars 2012-07-17 05:56:52

+0

謝謝。正是我想知道的。 – 2012-07-17 06:00:28

+1

@SeainMalkin你接受了一個錯誤的答案。你知道只有參考值被複制(按值),而不是對象? – PointedEars 2012-07-17 06:27:56