据我了解,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 {}
答案 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
的新值将不会传播到函数外部。