在函数中按值传递对象

Passing objects by value in a function

本文关键字:对象 按值传递 函数      更新时间:2023-09-26

考虑这个代码块,它是按值传递参数的基本示例(这里它是一个对象,按值传递):

function setName(obj) {
 obj.name = "Pork";
 obj = new Object();
 obj.name = "Chicken";
}
var person = new Object();
setName(person);
alert(person.name);

这段代码的输出是"Pork"(显然),但我试图理解的是为什么在 setName 函数中创建的新对象不会覆盖存储在 obj 中的值。相反,这显然会创建一个指向本地对象的指针,该指针在函数执行结束时被销毁。

对象在 JavaScript 中作为引用传递,但引用本身是一个值。换句话说,您只能更改输入对象的成员,而不能更改其引用。生产线中发生了什么

obj = new Object();

是对"obj"的引用的本地副本被修改,但是当函数返回时,这个本地副本被丢弃。

obj ,即使它是参数的名称,其行为也类似于 setName 函数中的局部变量。调用函数时,它引用作为参数传入的任何内容。当您将其设置为等于一个新的不同对象时,它的行为就像本地引用,现在指向(新)对象。此时,您已经丢失了对原始参数的引用。(当函数结束时,对较新对象的引用本身将丢失。

function setName(obj) { // "obj" is the local variable that will refer to the argument
 obj.name = "Pork";  // obj points to the object passed in, which is modified
 obj = new Object(); // obj is set to point to a new Object
 obj.name = "Chicken";  // the new object is modified.
     // the new object is dropped here 
}

每次使用 this: new Object()创建对象的新实例时。如果要更改当前信息,则需要坚持使用相同的变量,而无需创建new Object()变量。

您的分析似乎是正确的。请注意,在现有函数中,您传递的是对调用之前创建的对象的引用。然后,用对新对象的引用覆盖引用。

如果要构造一个新值,则需要将其作为函数的返回值,或者将新对象设置为参数的属性或数组中的值。

当你调用setName函数时,你正在将person的引用传递给它person objobj不保存person对象(person也不保存)。personobj 共享一个对象。创建新对象new Object()时,您将引用分配给该对象 obj .所以现在obj保留对完全不同的对象的引用。这就是为什么您不能再改变person对象的原因。