2014-03-04 411 views
2

我已經看到這個問題被多次詢問,但我有一個具體的例子來澄清。JavaScript通過引用或值傳遞?

var a = {animal: 'cat'}; 

var b = a; 

a.animal = 'bear'; 

在這裏,我看到b.animal會給出一個輸出「熊」。這是爲什麼?如何保留變量b的原始參考「貓」?

+4

您已將a *引用*從'a'複製到'b',但它們都指向相同的對象*。如果要複製對象,則需要將該對象的每個屬性複製到一個新對象。 –

+1

看看這個問題:http://stackoverflow.com/q/122102/522479 –

+3

它是由值,但值是一個對象引用。所以,'b'是'a'的副本,但它們仍然指向同一個對象。 [JavaScript是傳遞引​​用還是傳值語言?](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value語言) –

回答

2

是,both refer to the same object定義它writeable:false

可能會讓你感到困惑,因爲在Javascript中,即使可以,通常也不會在內置類型上使用「新」關鍵字。

你也可以申報「一」是這樣的:

var a = new Object(); 
a.animal = "cat"; 

現在也許是更清楚爲什麼「B」的變化時,「一」的轉變。

如果你「b」有它自己的屬性,那麼you have to clone "a"

1

「基元」被複制,對象不是(即,參考它被複制)。 如果你需要保護的財產,通過defineProperty