将 var 分配给临时变量不会阻止原始变量更改



好吧,堆栈溢出,

我一直在工作数小时来解决JavaScript中的问题(在NodeJS服务器中编写),但我真的不明白。

这是发生的情况:

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

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

我的问题:

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

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

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];
    }
}

不是为了自我推销,但我写了一篇关于这个主题的博客文章,其中更详细地介绍了。你可以在这里找到。

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

要创建对象

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

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

var temp = _.clone(data);

最新更新