Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数中按值传递对象_Javascript - Fatal编程技术网

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++术语来帮助。