在函数中按值传递对象
Passing objects by value in a function
考虑这个代码块,它是按值传递参数的基本示例(这里它是一个对象,按值传递):
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
obj
。 obj
不保存person
对象(person
也不保存)。person
和 obj
共享一个对象。创建新对象new Object()
时,您将引用分配给该对象 obj
.所以现在obj
保留对完全不同的对象的引用。这就是为什么您不能再改变person
对象的原因。
- 将值传递到服务器对象
- 在函数中按值传递对象
- 变量/对象是否按值传递,为什么我不能在 javascript 中使用变量更改对象的属性
- Javascript :按值传递字符串
- JSON对象按值分组
- setTimeout 按值传递数组(在咖啡中)
- JavaScript 处理参数按值传递
- 为什么这个数组是通过引用而不是按值传递的,我该如何改变它
- 将日期对象按角度传递到指令
- Javascript函数的所有参数都只按值传递
- 数组/对象按值复制/按引用复制
- Javascript数组按值传递不起作用
- jQuery事件绑定按值传递
- Web Workers——如果对象是按值传递的,内存使用量会翻倍吗?
- 是JavaScript按引用传递或按值传递
- React:如果值是按值传递的,那么为什么有必要拥有不可变的道具呢
- 如何使用 Javascript 将对象参数值传递给同一对象的方法
- 变量赋值 - Javascript: array1[0] = array2[0];这是按值传递还是按引用传递
- 我想按值传递数组,但似乎它是通过引用传递的,数组上的 .map 操作没有给出预期的结果
- 按值传递JavaScript数组