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

问题描述 投票:0回答:5

对象通过引用传递。它们永远不会被复制。

我有一个代码段如下:

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

我的问题是我把对象person的

firstname
更新为
Tom
后,为什么局部变量
fname
没有更新?

javascript object pass-by-reference
5个回答
5
投票

Javascript 中的值从不通过引用传递,总是通过值传递。在对象的情况下,这些值本身就是引用。

如果您考虑接收

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


1
投票

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


0
投票

对象通过引用传递。

  1. “对象”不是值,不能“传递”。
  2. 没有通过引用传递或赋值。

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

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


-1
投票

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

一步步来(删除不相关的行),使用 --> 表示“指代”:

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 所指的内容。

© www.soinside.com 2019 - 2024. All rights reserved.