Javascript 在函数中按值传递对象
考虑这段代码,这是按值传递参数的一个基本示例。这里是按值传递的对象:Javascript 在函数中按值传递对象,javascript,Javascript,考虑这段代码,这是按值传递参数的一个基本示例。这里是按值传递的对象: function setName(obj) { obj.name = "Pork"; obj = new Object(); obj.name = "Chicken"; } var person = new Object(); setName(person); alert(person.name); 这段代码的输出很明显是正确的,但我想理解的是,为什么在setName函数中创建的新对象不会覆盖存储在obj中的值。相反
function setName(obj) {
obj.name = "Pork";
obj = new Object();
obj.name = "Chicken";
}
var person = new Object();
setName(person);
alert(person.name);
这段代码的输出很明显是正确的,但我想理解的是,为什么在setName函数中创建的新对象不会覆盖存储在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
}
对象在JavaScript中作为引用传递,但引用本身是一个值。换句话说,您只能更改输入对象的成员,而不能更改其引用。排队时发生了什么
obj = new Object();
是指修改了obj引用的本地副本,但当函数返回时,该本地副本将被丢弃 每次使用此:新建对象时,您都在创建该对象的新实例。如果要更改当前信息,则需要使用相同的变量,而无需创建新的对象变量 您的分析似乎是正确的。请注意,在现有函数中,您传递了对在调用之前创建的对象的引用。然后使用对新对象的引用重写引用
如果您想构造一个新值,则需要将其设置为函数的返回值,或者将新对象设置为参数的属性或数组中的值。当您调用setName函数时,您将向其传递person引用。现在,obj和person都持有对该对象的引用。obj不保存person对象person也不保存。person和obj都共享一个对象。创建新对象时,您在obj中指定了对该对象的引用。因此,现在obj保留了对完全不同对象的引用。这就是您不能再对person对象进行变异的原因。您想阅读问题的答案。可能是重复的谢谢,我将阅读所有答案,看看他们是否澄清了我的问题。有很好的解释,对象引用及其值的图表。虽然是java的,但在本例中,它们的行为类似。顺便说一句,对所有否决这个问题的人来说:我确实声明我搜索了一个答案,但在搜索中没有找到一个答案,有人根据这个问题编辑了这个答案。但是你必须考虑到搜索这个问题的关键词会返回数百页,所以我可能错过了正确的答案。不是我的错,搜索功能没有按相关性对结果进行正确排序。@Manwal-因为您和OP使用了错误的引号样式。@Manwal:引号字符错误-它们是印刷引号。我把它们改成了直接的引号,现在它在小提琴上工作了。对不起,我现在改了引号。这个例子来自我正在使用的一本书。我认为如果这些教JS的书更清楚地说明原语是通过值传递作为拷贝,并且对象以值传递作为引用,基本上是一个指针,用C++术语来帮助。