0

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

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 没有更新?

4

5 回答 5

5

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

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

于 2013-06-27T20:21:55.770 回答
1

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

于 2013-06-27T20:22:30.863 回答
0

对象通过引用传递。

  1. “对象”不是值,不能“通过”。
  2. 没有任何内容通过引用传递或分配。
于 2013-06-28T02:08:04.143 回答
-1
 var fname=person.firstname; // here fname is a string, not an object

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

于 2013-06-27T20:25:03.763 回答
-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 所指的内容。

于 2013-06-27T20:30:34.517 回答