2013-06-27 24 views
-1

對象按引用傳遞。他們從不復制。我有代碼段如下:如果通過引用傳遞JavaScript對象,爲什麼更新屬性值不會更新本地變量

var person={firstname:'John', lastname:'Smith'} 
var anotherPerson=person 
anotherPerson.nickname='Curly' 
console.log(person.nickname) 
"Curly" 
var fname=person.firstname 
console.log(fname) 
"John" 
person.firstname = 'Tom' 
console.log(anotherPerson) 
Object {firstname: "Tom", lastname: "Smith", nickname: "Curly"} 
console.log(fname) 
"John" <-- fname is not updated 

我的問題是在我更新的對象者的姓名爲「湯」,爲什麼不更新本地varialbe FNAME?

回答

4

JavaScript中的值永遠不會通過引用傳遞,始終按值傳遞。這些值本身就是對象的引用。

如果您認爲接收person作爲參數的函數只能更改其內容,則無法替代person變量的整個值,所以事實上,即使對象按值傳遞也應該清楚。對於fname也是如此,另外限制了字符串是不可變的,這意味着接收變量值fname的函數根本無法改變這個變量。

+0

在這個例子中,字符串不可變性是無關緊要的。 – Darren

+0

@Darren如果字符串不是不可變的,你可以做'fname [2] ='c';'這會改變字符串。 –

+0

我完全同意 - 我只是說不變性與作業方式無關。 – Darren

1

它通過值傳遞,而不是通過引用。

-1
var fname=person.firstname; // here fname is a string, not an object 

對人做的任何更新都不會反映在fname中,因爲它是原始類型,而不是對象。

+0

並非如此,這是因爲字符串是不可變的。如果firstname被定義爲'new String('John')',那麼您將具有相同的限制。 –

0

與其他一些答案相反,它與這些類型是否是原始類型無關。

會一步一步地(與不相關的行刪除),用 - >來表示 '是指':

var person={firstname:'John', lastname:'Smith'} // person.firstname --> "John" 
var fname=person.firstname // fname --> "John" 
person.firstname = 'Tom' // person.firstname --> "Tom" 
console.log(fname) // fname still --> "John" 

如果然後做:

​​

然後FNAME現在會參考'鮑勃'。 fname是您創建的引用person.firstname引用的對象的引用。更改person.firstname引用的內容不會更改fname引用的內容。

+0

「fname是您創建的引用person.firstname引用的對象的引用」否,'fname'只是一個字符串原語!它包含在賦值時處於person.firstname中的字符串的副本。 – bfavaretto

+0

fname是一個變量。它是一個字符串文字的指針(aka引用)。作業不會創建副本!它只是創建一個新的指針/數據引用。更改分配的變量對其他變量沒有影響。 – Darren

+0

您是否在談論如何通過js引擎實現變量?如果是這樣,你可能是正確的(我不知道細節),但在這種情況下,它不理解語言的行爲。在js本身中,沒有指針,變量「包含」值。有些值是基元,其他值是引用(對象)。 – bfavaretto

0

通過引用傳遞對象。

  1. 「對象」不是值,不能「通過」。
  2. 沒有任何內容被傳遞或通過引用分配。
相關問題