2015-12-19 17 views
0

路過這裏是代碼:JS引用的函數

var a = {}; 
var b = {name:"Spork"}; 

function connect(o1,o2){ 
    o1 = o2; 
}; 

connect(a,b); 

console.log(a); 
console.log(b); 

它打印:{}{name:"Spork"}

它應該是:{name:"Spork"}{name:"Spork"}

請告訴我,爲什麼在最後一不指向b。如果在一個函數中通過引用傳遞對象,我認爲我的函數告訴a指向與b相同的內存空間。

+0

簡而言之,引用本身是按值傳遞的。 http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language – Reek

+0

非常感謝你們! – Alex

回答

0

「通過引用傳遞」只是一個抽象;您實際上是通過值傳遞對內存中對象的引用。所以o1o2是包含與ab包含的相同參考的不同變量。

簡而言之,ao1是兩個不同的容器,其內容相同。與bo2一樣。

由於o1o2獨立於ab,因此將一個引用分配給另一個引用不會影響函數;完成所有的覆蓋在o1參考,這意味着o1o2將引用同一個對象..

你需要的是修改對象引用指向。在你的情況下,你想將一個對象(即o2指向的對象)的所有屬性複製到另一個對象(由o1指向的對象)。

的Javascript提供了一個方便的方式來做到這一點使用Object.assign()

function connect(o1, o2){ 
    Object.assign(o1, o2); 
} 

Here的演示。

0

它的所有關於你的變量的知名度,看到你正在申報var a = {}; var b = {name:"Spork"};外連接方法的確定,那麼你將它們傳遞給connect方法,o1 and o2是本地connect方法和任何變化裏面connect方法發生不會反映在它之外,那麼爲什麼在打印它們時你不是空值a