两个具有相同值的对象,计算和更改一个对象的值。第二个也是神奇地拥有新的价值观

时间:2016-02-26 22:55:07

标签: javascript node.js javascript-objects for-in-loop

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

我有以下情况:

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 个答案:

答案 0 :(得分:-2)

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

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

    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/

    希望这可以帮助你!!