【问题标题】:JavaScript pushing an object in an array is what - by reference or value?JavaScript 在数组中推送对象是什么 - 通过引用或值?
【发布时间】:2013-06-27 11:38:27
【问题描述】:

当我创建一个对象并将其推送到数组时,它是通过引用存储还是通过值存储?

我看到了以下情况:

var abc = { a: 10, b: 20};
var def = [];
def.push(abc);

abc.a = 100;

def[0].a; // outputs 100!

// if I do this
abc = { a: 10000, b: 20000 };

def[0].a; // still 100, no change this time

来自控制台的图像:

如果我使用= 符号将对象分配给abc,那么abc 在数组def 中指向的引用也应该改变,不是吗?我们在上面按值还是按引用称呼什么?

我理解它就像abc 是一个指向一个值的引用。只要我们不使用= 符号,它就会一直指向那个。请指导。

【问题讨论】:

  • 改变一个对象的属性,你会看到。如果另一个对象也发生了变化,那么它们都引用了同一个对象。否则它们就是副本。

标签: javascript coding-style


【解决方案1】:

让我们看看发生了什么:

var abc = { a: 10, b: 20};

在内存中创建一个新对象并分配给变量abc

var def = [];

在内存中创建一个新数组并分配给变量def

def.push(abc);

在数组内部现在有一个指向以前创建的对象的指针。

 abc.a = 100;

 def[0].a; // outputs 100!

显然正确。我们正在修改对象,该对象也被数组引用。

 abc = { a: 10000, b: 20000 };

再次创建一个新对象,并且对它的引用存储在abc 中。现在我们在内存中有两个对象(和一个数组)。

 def[0].a; // still 100, no change this time

当然,这仍然是100。数组指针仍然引用第一个创建的对象,而不是第二个。

【讨论】:

  • 对正在发生的事情的详细分解!
  • 1.从第一个答案来看,似乎在数组内部,有值 而不是指针 - 并且该值由abc 指向外部。 2.对象不是被数组引用,而是被字面量abc引用。所以如果abc失去了指向,我们就不能从外部修改数组里面的对象
  • 顺便说一句,我没有投反对票。我仍然对通过引用和价值传递感到困惑。有什么好的资源吗?
  • @OmShankar 按值传递意味着您只是创建数据的新副本,而按引用传递意味着您只复制引用堆上相同对象的数据的指针(内存地址)
  • @OmShankar 就像第一个答案中提到的那样,对象只是被引用。因此,如果您为abc 分配一个新值,则旧引用将被覆盖,但不会覆盖实际对象。如果有对该对象的任何其他引用,它们将保留。如果没有对旧对象的引用,它将由垃圾回收处理。
【解决方案2】:

对象总是通过引用传递。

当你写abc = { a: 10000, b: 20000 }时,你覆盖的是变量 abc,它指向旧对象,但现在指向新对象。

【讨论】:

  • 当然该赋值将一个新对象分配给 abc,但这并没有说明通过引用传递对象。
  • 那么abc 里面的def 会发生什么。似乎def 只是具有abc 指向的。那么我们可以称之为按值传递吗?
【解决方案3】:

正如你所说的create an object,那么你正在处理引用。

在您的第二条语句abc = { a: 10000, b: 20000 }; 中,您实际上所做的只是将变量abc 品脱到新对象中,使其引用旧的abc 以外的其他东西

【讨论】:

    【解决方案4】:

    问题的原因是当您将对象推送到数组时,它会自我克隆。我的意思是在数组中有一个对象的克隆。因此,如果您更改对象的属性,则不会发生任何变化。因为你已经有 2 个对象了。如果你想覆盖它,你可以在用新值定义 abc 之后使用 def[0] = abc 。除了你不能在不指定的情况下更改值

    【讨论】:

    • 你显然不明白值和引用类型的区别……
    • 你为什么这么认为?我的意思是数组中没有指向点对象的指针。数组中有新对象。当然可能是错的
    • 数组只保存指向堆上相同对象引用的指针,通过将 abc 对象推入 def 数组,您只需创建指针的新副本引用同一个对象
    • 我试图解释同样的事情。我也喜欢你
    猜你喜欢
    • 2020-04-18
    • 2022-10-24
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2017-01-24
    • 2021-01-02
    相关资源
    最近更新 更多