0

好的堆栈溢出,

我一直在努力解决 javascript 中的问题(在 NodeJS 服务器中编写),但我真的不明白。

这就是发生的事情:

var data = {x: 50};
var temp = data;
temp.x = 100;
console.log(data.x);
//logs 100

我已经测试了这个确切的代码,它确实显示了100

我的问题:

如何将 var 克隆为临时变量并更改临时变量而不改变原始变量。

4

3 回答 3

4

您必须克隆原始对象。这是因为将对象存储在另一个变量中不会创建具有与前一个相同属性的新对象。它只是创建对同一对象的引用。可悲的是,没有任何内置的解决方案可以解决这个问题,但有一些解决方案。这里想到了一些:

var temp = JSON.parse(JSON.stringify(data)); // clones the object using a hack

或者:

var temp = {}; // creates a new object and gives it all the same properties as
               // the old one.
for(prop in data) {
    if(data.hasOwnProperty(prop)) {
        temp[prop] = data[prop];
    }
}

不要自我推销,但我已经写了一篇关于这个主题的博客文章,其中更详细一点。你可以在这里找到。

于 2012-11-27T23:53:44.543 回答
3

将对象分配给变量不会生成对象的副本。它只是创建对同一对象的另一个引用。然后,两个变量都将指向完全相同的对象,并且更改其中一个(在您的示例中)的属性datatemp更改完全相同的对象。

要制作对象的副本,必须通过将所有属性复制到新对象来实际制作对象的显式副本。

于 2012-11-27T23:53:53.873 回答
0

您可以使用clone下划线库的方法轻松克隆对象。

var temp = _.clone(data);
于 2012-11-28T01:04:11.473 回答