【问题标题】:Why does second variable holding first variables initial object ref variable does not update when firsts points to a new object ref s? [duplicate]为什么当 first 指向新对象 ref s 时,保存第一个变量初始对象 ref 变量的第二个变量不更新? [复制]
【发布时间】:2018-06-02 18:34:35
【问题描述】:

据我了解,x = { greet: hi } 中的对象引用 x 存储对对象 { greet:hi} 的引用,这与保存实际值的原始类型 (y=10) 不同

在以下代码中,console.log(y) 输出 {greet: "hi"}

x obj ref 更新为指向x = {greet: 'hello'} 时,为什么y 对象引用没有更新为指向{greet: 'hello'}

var x = {greet: 'hi'};
var y = x;
x = {greet: 'hello'};

console.log(y);
console.log(x)

【问题讨论】:

  • 您所描述的意味着y = x 使yx别名,即它们实际上都是同一个变量。这不是它的工作原理。您只是将存储在x 中的对象引用分配给y
  • @deceze 不确定这是否重复。
  • @OP,使用引用分配/复制对象。这意味着,您正在交换内存位置和该内存位置的对象的访问属性。因此,一个变量中的属性变化会反映在其他变量中。现在,当您执行x = {greet: 'hello'}; 时,您正在替换引用本身。因此,现在该变量将保存指向其他位置的指针,并且先前位置的对象将保持原样。如果没有人引用它,GC 将摆脱它。
  • @deceze 当然,我检查了提到的问题。虽然这两个问题的性质有一些共同点,但并不完全相同。
  • @Rajesh Meh... 至少这个问题每个月肯定会得到数次回答,而且我们不再需要它的另一个副本。如果您对欺骗目标有更好的建议,请务必......

标签: javascript javascript-objects


【解决方案1】:

因为在x = {greet: 'hello'}; 行中正在创建一个新对象。

使用x.greet = 'hello'; 更新旧对象。

var x = {greet: 'hi'};
var y = x;
x.greet = 'hello';

document.getElementById("text_show").innerHTML= x.greet + " | " + y.greet;
<div id="text_show"></div>

请参阅 here 以了解 JavaScript 中的对象

【讨论】:

  • 确实如此。基本上,如果您通过说x.greet = "hello" 来更改 x,您会看到您所期望的 (@OP)。在这种情况下,y 看起来像 x
【解决方案2】:

为什么 y 对象引用没有更新为指向 {greet: 'hello'} 当 x obj ref 更新为指向 x = {greet: 'hello'}

因为您已为 x 分配了一个新引用,而 y 仍指向原始引用。

当你说

var y = x;

你将y指向x指向的同一个引用,你没有将y指向x

【讨论】:

  • you are not pointing y to x. 确切地说,x 是一个引用,当我写var y = x 时,该引用也被复制到y,所以当x 中的引用发生变化时,该更改应该传播到y还。对吗?
  • 所以当 x 中的引用更改时,该更改也应该传播到 y 不,如果引用值本身已更改,则 x 将指向新引用(新对象)而 y 将继续指向较旧的。如果值发生更改,例如 var x = {greet: 'hi'}; var y = x; x.greet = 'hello';,那么 y.greet 也会发生更改。
  • 找到了更直接的解释here。 > Javascript 的评估策略是始终使用按值调用,但在对象(包括数组)的情况下,传递的值是对对象的引用,它不会被复制或克隆。如果您在函数中重新分配对象本身,则不会更改原始对象,但如果您重新分配对象的属性之一,则会影响原始对象。
猜你喜欢
  • 2019-11-02
  • 2016-07-11
  • 2017-06-09
  • 1970-01-01
  • 2021-12-13
  • 2021-10-25
  • 2015-01-07
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多