对象分配正在改变值

时间:2017-09-07 06:28:33

标签: javascript

我有一个对象,我用它来重置值,如下所示:

const char*

然后我使用export const cleanTeam = { id: "", name: "", players: [] } 创建一个新对象,如下所示:

cleanTeam

然后我会在let team1 = cleanTeam; 中设置属性值,例如:

team1

稍后,我使用team1.id = 123; team1.name = "My New Team"; 创建team2,以便我有一个具有相同结构但没有值的新对象。但是,我注意到我分配的值也在cleanTeam中。换句话说,我的cleanTeam现在看起来像这样:

cleanTeam

我在{ id: 123, name: "My New Team", players: [] } 设置值时不应该cleanTeam保持不变吗?

我知道为什么会这样。我认为team1cleanTeam都指向内存中的同一个对象。如何保持team1对象清洁

2 个答案:

答案 0 :(得分:1)

对象是引用类型。将一个对象分配给另一个对象时,它只复制引用。所以你实际上有两个引用相同对象的引用。

考虑一个有两扇门的房间。当你从第一扇门进来并在房间里进行更改然后从第二扇门进来时,你会看到变化。

要复制第一级值,您可以使用Object#assign功能。这会复制属性。但请注意,如果对象中有对象,则只会在您的players案例中复制引用,这是一种引用类型。

const cleanTeam = {
   id: "",
   name: "",
   players: []
};

const newObj = Object.assign({}, cleanTeam);

newObj.id = 1;

console.log(cleanTeam, newObj);

为什么不使用JSON.parse(JSON.stringify())解决方案?

它不会复制这些功能,因为JSON仅存储状态,而不存储功能

const a = {
  id: 1,
  func: function(){
    console.log('Hello');
  }
};

a.func();

const b = JSON.parse(JSON.stringify(a));

b.func(); // Error

答案 1 :(得分:1)

要复制对象,请执行以下操作:
    var team1 = JSON.parse(JSON.stringify(cleanTeam))

这个技巧创建了一个新对象,它指向内存中的另一个地址,因此对原始地址的引用将丢失。

在你的情况下,这个会起作用,但请记住Suren说的话:

  

它不会复制这些函数,因为JSON只存储状态,而不存储功能