传递对象并更改对象与更改JavaScript中的属性

时间:2019-06-23 03:38:33

标签: javascript function pass-by-reference

据我了解,JavaScript对象是通过引用传递的(或通过值传递的,其中值是对象的内存地址)。为什么当我更改要传递到函数中的整个对象时,我的更改未反映在全局窗口对象内部?

但是当我更改传递给函数的对象的属性时,该对象会更新吗?

// Case 1
var objectX = {name: 'stackoverflow'};

function changeProperty(objectX) {
   objectX.name = 'google';
}

changeProperty(objectX);
console.log(objectX); // {name: 'google'};

// Case 2
var objectY = {name: 'stackoverflow'};

function changeEntireObj(objectY) {
   objectY = {};
}

changeEntireObj(objectY);
console.log(objectY); // {name: 'stackoverflow'} instead of {}

2 个答案:

答案 0 :(得分:0)

认为变量名称(对于对象)包含这些对象的内存地址。在情况1中,objectX.name = 'google';objectX所引用的内存中查找对象,并对其属性之一进行突变。在情况2中,当您执行objectY = {};时,该函数内部称为objectY的变量将引用新创建的空对象-但从未在该函数外部定义的原始对象从未重新分配,因此仍然指向原始对象在内存中的位置。

如果您希望外部objectY指向新对象,则必须从函数中显式返回新对象并重新分配外部变量:

var objectY = {name: 'stackoverflow'};

function changeEntireObj(objectY) {
   objectY = {};
   return objectY;
}

objectY = changeEntireObj(objectY);
console.log(objectY);

答案 1 :(得分:0)

  

传递值,其中值是对象的内存地址

这正是发生的情况。

在您的changeEntireObj(obj)第一个参数输入时,包含JS堆中对象的地址。

当您这样做

objectY = {};

您只需将新值(新对象的地址)分配给objectY

此更改是该功能的本地更改。当参数通过值传递时,objectY的新值将不会传播到函数外部。