对象引用的变量重新分配使其他对象保持不变(无“传递”分配)

Posted

技术标签:

【中文标题】对象引用的变量重新分配使其他对象保持不变(无“传递”分配)【英文标题】:Variable re-assignment of object reference leaves other object unaltered (no “transitive” assignment) 【发布时间】:2017-06-08 10:31:59 【问题描述】:

我有一个想要替换的对象。

var obj1 =  x: "a" ;
var ref = obj1;
var obj2 =  y: "b" ;

obj1 = obj2;

这导致ref 等同于 x: "a" ,但我希望它也可以更改为指向obj2 以使ref 等同于 y: "b"

【问题讨论】:

不是很清楚,你想要什么 我基本上想替换对一个对象的引用。所以当我做 obj1 = obj2 时,我希望所有对 obj1 的引用都被替换为对 obj2 的引用 这不是javascript的工作方式:) @ValLeNain 这就是我已经想到的,但你永远不会知道。通常有一些我仍然不知道的解决方法。显然不是这次:) 【参考方案1】:

不可能。 JS 通过引用的副本传递对象,因此在步骤var ref = obj1 中,您实际上并没有像在 C 之类的语言中那样分配引用指针。相反,您正在创建指向对象的引用的副本看起来像x: 'a'

有关您拥有的其他选项,请参阅此答案:https://***.com/a/17382443/6415214。

【讨论】:

【参考方案2】:

你可以尝试用obj2的字段来改变obj1的所有字段

var obj1 =  x: 'a' ;
var ref = obj1;
var obj2 =  y: 'b' ;
obj1.x = obj2.y;
console.log(ref) // Print x, 'b'

如果你想添加 y,'b' 你可以按照方法

obj1.y=obj2.y
console.log(obj1); prints x: "b", y: "b"
console.log(ref); prints x: "b", y: "b"

如果你想删除 obj1.x,你可以这样做

delete obj1.x;
console.log(ref) prints y:'b'

【讨论】:

以上是关于对象引用的变量重新分配使其他对象保持不变(无“传递”分配)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个对象在分配其他东西时不通过引用传递?

java基础

在 C# 中,我应该按值传递参数并返回相同的变量,还是按引用传递?

对 Java 的按值传递和不变性感到困惑

引用类型变量,对象,值类型,值传递,引用传递 区别与定义

为啥在 PHP 中通过引用传递?