【发布时间】:2019-11-05 07:55:49
【问题描述】:
据我了解,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 {}
【问题讨论】:
-
因为参数就像局部变量。
-
@Pointy 这样理解可以吗?
function changeEntireObj(objectY) { var localObjectY = objectY; // this is done under the hood localObject = {}; // memory address of original objectY is unchanged. } -
是的,正确的。请注意,您的参数
objectY具有相同名称这一事实是故事的一部分。具有 不同 名称的相同代码的行为方式相同,但function changeEntireObj(x) { objectY = {}; }的行为与您预期的一样,因为在这种情况下,objectY将 引用全局变量。
标签: javascript function pass-by-reference