对象通过引用传递。它们永远不会被复制。
我有一个代码段如下:
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 中的值从不通过引用传递,总是通过值传递。在对象的情况下,这些值本身就是引用。
如果您考虑接收
person
作为参数的函数只能更改其内容,它不能替换 person
变量的整个值,那么即使对象按值传递的事实也应该清楚。 fname
也是一样的,额外的限制是字符串是不可变的,这意味着接收 fname
变量值的函数根本不能改变这个变量。
它是按值传递的,而不是按引用传递的。
对象通过引用传递。
var fname=person.firstname; // here fname is a string, not an object
你对 person 所做的任何更新都不会反映在 fname 中,因为它是原始类型,而不是对象。
与其他一些答案相反,它与类型是否原始无关。
一步步来(删除不相关的行),使用 --> 表示“指代”:
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 所指的内容。