JavaScript中的對象是否通過引用傳遞? 如果是爲什麼此代碼無法正常工作。通過引用或按值傳遞
function change(myObj)
{
myObj={};
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
但是當我做
function change(myObj)
{
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 2
JavaScript中的對象是否通過引用傳遞? 如果是爲什麼此代碼無法正常工作。通過引用或按值傳遞
function change(myObj)
{
myObj={};
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
但是當我做
function change(myObj)
{
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 2
我會解釋這徹底
o={a:1};
首先你設置全局變量o是具有屬性變量與值= 1名這個對象{A:1}新的匿名對象的引用爲「1A 「
change(o);
現在給你打電話的功能變化和typeof運算變量o的JavaScript的檢查,它的‘對象’
實際上它應該是‘引用,指向的對象’,所以對象的引用{A:1}是傳遞到功能順便說一句,如果變量是原始的,它將只通過值
function change(myObj){
現在函數更改默認情況下創建變量myObj,其類型爲'undefined',然後因爲它獲取了引用參數而變爲'object',並且現在變量myObj是指向對象'1A'的引用變量=> {a: 1},myObj僅在函數變化 中可見,如果myObj只是對象'1A'的引用副本=> {a:1},則全局變量o仍可指向對象'1A'=> {a:1}通過語言設計
myObj={};
現在參考變量MyObj中被點到新的匿名空對象{}名此對象爲「2B」
myObj.a=2; }
現在您使用引用myObj將對象'2B'=> {}設置爲具有值爲2的新屬性a並且結束意味着全局無法看到對象'2B'=> {a: 2}
alert(o.a); //alert 1
變量仍然指向或者可以被重新指向對象{A:1},參考ö不能失去其點,因爲
對象 '2B'=> {A:2}不能在函數更改
之外被看到,並且將被垃圾回收銷燬,因爲它丟失了引用
而對象'1A'=> {a:1}不能被垃圾回收銷燬
,因爲變量o仍然指出爲什麼你打電話給你收到物品'1A'=> {a:1}
對不起,我的語法錯誤,但我盡我所能,使其易於閱讀。
哇這個很好解釋謝謝 – user1758424
在這種情況下要覆蓋參考實際的對象。
function change(myObj)
{
myObj={}; //overwriting the reference in myObj here.
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
認爲它是這樣的:
function change(myObj = referenceToObjectPassedIn)
myObj = new Object() ;
// referenceToObjectPassedIn lost in limbo
myObject.a = 2; //modifying newly created object.
解決你的問題,你將不得不返回新對象。
謝謝,這是非常有益的 – user1758424
對該對象的引用傳遞給方法。在第一個示例中,您正在修改引用以指向其他對象,而不是嘗試更改引用指向的對象,因此,該更改在該方法之外不可見。
在第二個示例中,您正在更改由myobj
引用指向的對象的狀態,因此在方法外可見。
所以它像c語言中的指針? – user1758424
不,像java中的引用。在C中,如果你傳遞一個指向方法的指針,改變指針指向一個不同的內存位置,這個改變在被調用的方法中是可見的。 – Vikdor
哦對吧謝謝我瞭解 – user1758424
在示例1中,您更改了myObj引用的內容,因此最終會更改不同的對象,然後是您想要的對象。當
alert(o.a);
被執行,o.a自從對象聲明以來沒有被改變,所以返回1。我希望這會有所幫助。還請閱讀本文,它應該清除一些東西,當我第一次學習JavaScript時幫助了我:http://www.snook.ca/archives/javascript/javascript_pass/。
http://stackoverflow.com/questions/9437981/object-pass-by-reference –