在函数中按值传递对象

时间:2015-03-16 16:40:47

标签: javascript

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

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

var person = new Object();
setName(person);
alert(person.name);

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

5 个答案:

答案 0 :(得分:4)

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

obj = new Object();

是修改了对“obj”的引用的本地副本,但是当函数返回时,将丢弃此本地副本。

答案 1 :(得分:3)

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 
}

答案 2 :(得分:0)

每次使用它时:new Object()您正在创建对象的新实例。如果要更改当前信息,则需要在不创建new Object()变量的情况下使用相同的变量。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

当您调用setName函数时,您将person的引用传递给它。现在objperson都保存对该对象的引用。 obj不会保留person个对象({1}}也不会。personperson共享一个对象。当您创建一个新对象时{ {1}},您在obj中为该对象分配了引用。所以现在new Object()包含对完全不同的对象的引用。为什么您不能再变异obj对象。