讓我們把它一行一行:
var foo = bar;
所有這些對象的名稱做的是在內存中保留的地址。因此,在此聲明中,您使foo
保持與bar
相同的內存地址。例如,如果bar
保持0xFF,則通過賦值foo
也保持0xFF。
但是,請記住bar
和foo
是兩個不同的對象,它們碰巧只是在內存中保存相同的地址。
現在,由於它們碰巧在內存中保存了相同的地址,所以bar
的變異成員也會影響foo
的成員,因爲它們綁定到同一個對象。
bar.prop = "something entirely different"; // affects foo.prop also
然而,這裏很關鍵的一點要記住:
Assignment only changes what the name of the object is bound to, and does not affect any other objects.
換句話說,下面的語句做bar
持有不同的內存地址,但是這並不影響foo
。現在
bar = "no longer an object"; // Made bar hold a different memory address
,說明報價:
Javascript is always pass by value, but when a variable refers to an object (including arrays), the "value" is a reference to the object.
拿這個例子:
function f(obj1, obj2)
{
obj1.prop = 10;
obj2 = {prop: 20};
}
var bar = {prop: 1};
var foo = {prop: 2};
f(bar, foo);
console.log("bar.prop: " + bar.prop + ", foo.prop: " + foo.prop);
這將打印出局:bar.prop: 10, foo.prop: 2
。在內部函數f
中,obj1保存與bar
相同的內存地址,obj2保存與foo
相同的內存地址。但是,只有欄受到影響,因爲f
內只反映對象的變更成員,而賦值obj2 = {prop: 20};
僅影響局部變量obj2
而不影響foo
。
換句話說,the "value" is a reference to an object
表示改變成員影響對象對象,但分配隻影響局部變量。
我可能已經回答了我自己的問題: 「JavaScript總是按值傳遞,但是當一個變量引用一個對象(包括數組)時,」值「是對該對象的引用。 但這仍然令人困惑,有人可以解釋更多? – Jeff 2012-02-27 22:50:58
看我的答案傑夫,請讓我知道,如果這是有道理的? – Josh 2012-02-27 22:52:06
可能的重複[是Java通過引用?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – 2012-02-27 22:57:13