考虑这段代码,这是一个按值传递参数的基本示例(这里是一个对象,它是通过值传递的):
function setName(obj) {
obj.name = "Pork";
obj = new Object();
obj.name = "Chicken";
}
var person = new Object();
setName(person);
alert(person.name);
此代码的输出是" Pork" (很明显),但是我试图理解的是为什么在setName函数中创建的新对象不会覆盖存储在 obj 中的值。相反,这显然会创建一个指向本地对象的指针,当函数执行结束时会被销毁。
答案 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
的引用传递给它。现在obj
和person
都保存对该对象的引用。 obj
不会保留person
个对象({1}}也不会。person
和person
共享一个对象。当您创建一个新对象时{ {1}},您在obj
中为该对象分配了引用。所以现在new Object()
包含对完全不同的对象的引用。为什么您不能再变异obj
对象。