如果JavaScript对象通过引用传递,为什么更新属性值不会更新局部变量

If JavaScript objects passed by reference, why update property value won't update local variable

本问题已经有最佳答案,请猛点这里访问。

对象通过引用传递。它们从不被复制。我有如下代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

我的问题是,在我将对象的名字更新为"tom"之后,为什么本地变量fname没有更新?


javascript中的值从不通过引用传递,而是通过值传递。这些值本身就是对象的引用。

如果您认为接收person作为参数的函数只能更改其内容,它不能替换person变量的整个值,那么即使对象也是按值传递的事实也应该是清楚的。对于fname也是一样的,但字符串是不可变的,这意味着接收fname变量值的函数根本无法更改该变量。


它是通过值传递的,而不是通过引用传递的。


Objects are passed around by reference.

  • "对象"不是值,不能"传递"。
  • 没有通过引用传递或分配的内容。

  • 与其他一些答案相反,它与类型是否是原始类型无关。

    一步一步地进行(删除无关行),使用-->表示"引用":

    1
    2
    3
    4
    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"

    如果你那么做了:

    1
    fname = 'Bob'

    那么fname现在指的是"bob"。fname是您创建的引用,它引用了person.firstname引用的对象。更改person.firstname引用的内容不会更改fname引用的内容。


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

    您对Person所做的任何更新都不会反映在fname中,因为它是一个基元类型,而不是一个对象。