两个具有相同值的对象,计算和更改一个对象的值.第二个也具有新的价值

Two objects with the same value, calculating and changing values of one object. And the second one misteriously has the new values too

本文关键字:一个对象 计算 第二个 对象 两个      更新时间:2023-09-26
可能

已经太晚了,我可能会变得疯狂,但这怎么可能。

我有以下情况:

var x = {a: [], b: []};
var y = {a: [], b: []};
Model.someFunction(obj1, function(res){
    x.a = res;
    y.a = res;
    Model.someFunction(obj2, function(res){
        x.b = res;
        y.b = res;
        macheWasAnderes();
        // Content of both objects:
        // x = {a: [punkt1: 20, punkt2: 30}, b: {punkt1: 50, punkt2: 60}]};
        // y = {a: [punkt1: 20, punkt2: 30}, b: {punkt1: 50, punkt2: 60}]};
    });
});
function macheWasAnderes(){
  for(let prop in x){
    for(let i = 0; i < x[prop].length; i++){
        for(let propa in x[prop][i]){
            x[prop][i][propa] = x[prop][i][propa] / 100;
        }
    }
  }
  console.log("x", x);
  console.log("y", y);
  // x = {a: [punkt1: 0.02, punkt2: 0.03}, b: {punkt1: 0.05, punkt2: 0.06}]};
  // y = {a: [punkt1: 0.02, punkt2: 0.03}, b: {punkt1: 0.05, punkt2: 0.06}]};
}

如您所见,我从模型函数的回调中接收了一些数据。完成这些操作后,我调用 machWasAnderes() 函数以便使用我的 x 对象进行计算。对于这个例子,我只是改变它的值除以一百并以这种方式保存它。

奇怪的是,当我打印出两个对象时,对象 y 也得到了计算值......

这怎么可能?

注意 这不是我的确切代码。我的代码要长得多,所以我创建了一个更简单的代码副本,其中包含该问题。

让我们开始一些基础知识。有两种类型的副本:浅拷贝和深拷贝。

  1. 浅拷贝是指仅将引用复制到其他参照而不复制到数据。所以基本上两个引用都指向同一个对象。这意味着更改一个对象也会影响其他引用。
  2. 深层复制是指创建数据的副本,然后将其分配给引用。

来到你的案例:当你说

x.a = res;
y.a = res;

两者都引用了与您执行浅层复制相同的对象。因此,当您更改x.a时,它反过来也会影响y.ax.by.b也是如此

阅读此内容..https://nikhilmachcha.wordpress.com/2015/08/24/deep-copy-vs-shallow-copy-php-way/

希望这对你有帮助!!