【问题标题】:Passing an object and changing the object vs changing its properties in JavaScript传递对象并更改对象与在 JavaScript 中更改其属性
【发布时间】: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


【解决方案1】:

将变量名称(对象)视为包含这些对象的内存地址。在情况 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);

【讨论】:

  • 这样理解可以吗? function changeEntireObj(objectY) { var localObjectY = objectY; // this is done under the hood localObject = {}; // memory address of original objectY is unchanged. }
  • 当然,这是一种看待它的方式——你只是改变了局部变量名的内存地址,而不是外部变量名的内存地址
【解决方案2】:

按值传递,这里的值是对象的内存地址

这正是发生的事情。

changeEntireObj(obj) 的第一个参数包含 JS 堆中对象的地址。

当你这样做时

objectY = {};

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

此更改是函数的本地更改。由于参数是按值传递的,objectY 的新值不会传播到函数之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多