我有一个对象,我用它来重置值,如下所示:
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
保持不变吗?
我知道为什么会这样。我认为team1
和cleanTeam
都指向内存中的同一个对象。如何保持team1
对象清洁?
答案 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只存储状态,而不存储功能