【问题标题】:If JavaScript objects passed by reference, why update property value won't update local variable [duplicate]如果JavaScript对象通过引用传递,为什么更新属性值不会更新局部变量[重复]
【发布时间】:2013-06-25 12:03:21
【问题描述】:

对象通过引用传递。它们永远不会被复制。我的代码段如下:

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 object pass-by-reference


    【解决方案1】:

    javascript 中的值永远不会通过引用传递,总是通过值传递。这些值本身就是对象的引用。

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

    【讨论】:

    • 字符串不变性在这个例子中是无关紧要的。
    • @Darren 如果字符串不是不可变的,您可以使用fname[2]='c';,这样会更改字符串。
    • 我完全同意 - 我只是说不变性与分配的工作方式无关。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      对象通过引用传递。

      1. “对象”不是值,不能“通过”。
      2. 没有通过引用传递或分配任何内容。

      【讨论】:

        【解决方案4】:
         var fname=person.firstname; // here fname is a string, not an object
        

        您对 person 所做的任何更新都不会反映在 fname 中,因为它是原始类型,而不是对象。

        【讨论】:

        • 不是真的,因为字符串是不可变的。如果名字被定义为new String('John'),您将有相同的限制。
        【解决方案5】:

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

        一步一步来(去掉不相关的行),使用 --> 表示“引用”:

        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 = 'Bob'
        

        那么 fname 现在将引用“Bob”。 fname 是您创建的引用,它引用 person.firstname 引用的对象。更改 person.firstname 所指的内容不会改变 fname 所指的内容。

        【讨论】:

        • "fname 是您创建的引用 person.firstname 引用的对象" 不,fname 只是一个字符串原语!它包含分配时 person.firstname 中的字符串的副本。
        • fname 是一个变量。它是一个指向字符串文字的指针(又名引用)。作业不会创建副本!它只是为数据创建一个新的指针/引用。更改分配给变量的内容不会影响任何其他变量。
        • 你说的是js引擎是如何实现变量的?如果是这样,您可能是正确的(我不知道细节),但在这种情况下,它与理解语言的行为方式无关。在 js 本身中,没有指针,变量“包含”值。一些值是原始值,其他值是引用(对对象)。
        猜你喜欢
        • 2019-03-15
        • 2017-05-25
        • 2012-01-26
        • 2019-06-22
        • 2016-08-20
        • 2016-03-30
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        相关资源
        最近更新 更多