Javascript 对象赋值正在更改值
我有一个用于重置值的对象,如下所示:Javascript 对象赋值正在更改值,javascript,Javascript,我有一个用于重置值的对象,如下所示: export const cleanTeam = { id: "", name: "", players: [] } let team1 = cleanTeam; 然后我使用cleanTeam创建一个新对象,如下所示: export const cleanTeam = { id: "", name: "", players: [] } let team1 = cleanTeam; 然后,我将在team1中设置属性值
export const cleanTeam = {
id: "",
name: "",
players: []
}
let team1 = cleanTeam;
然后我使用cleanTeam
创建一个新对象,如下所示:
export const cleanTeam = {
id: "",
name: "",
players: []
}
let team1 = cleanTeam;
然后,我将在team1
中设置属性值,例如:
team1.id = 123;
team1.name = "My New Team";
稍后,我使用cleanTeam
创建team2
,这样我就有了一个结构相同但没有值的新对象。但是,我注意到我分配的值也在cleanTeam
中。换句话说,我的cleanTeam
现在看起来是这样的:
{
id: 123,
name: "My New Team",
players: []
}
当我在team1
中设置值时,cleanTeam
不应该保持不变吗
我知道为什么会这样。我认为
cleanTeam
和team1
都指向内存中的同一个对象。如何保持cleanTeam
objectclean?对象是引用类型。将一个对象指定给另一个对象时,它仅复制引用。实际上,有两个引用引用同一个对象
考虑一个有两扇门的房间。当你从第一扇门进来,在房间里做些改变,然后从第二扇门进来时,你会看到改变
要复制第一级值,可以使用函数。这将复制属性。但是请注意,如果对象中有对象,这将仅在您的案例中复制引用players
,这是一种引用类型
const cleanTeam={
id:“”,
姓名:“,
玩家:[]
};
const newObj=Object.assign({},cleanTeam);
newObj.id=1;
console.log(cleanTeam,newObj)代码>对象是引用类型。将一个对象指定给另一个对象时,它仅复制引用。实际上,有两个引用引用同一个对象
考虑一个有两扇门的房间。当你从第一扇门进来,在房间里做些改变,然后从第二扇门进来时,你会看到改变
要复制第一级值,可以使用函数。这将复制属性。但是请注意,如果对象中有对象,这将仅在您的案例中复制引用players
,这是一种引用类型
const cleanTeam={
id:“”,
姓名:“,
玩家:[]
};
const newObj=Object.assign({},cleanTeam);
newObj.id=1;
console.log(cleanTeam,newObj)代码>要制作对象的副本,请执行以下操作:
var team1=JSON.parse(JSON.stringify(cleanTeam))
这个技巧会创建一个指向内存中另一个地址的新对象,从而丢失对原始地址的引用
在你的情况下,这一个会起作用,但请记住Suren所说的:
它不会复制函数,因为JSON只存储状态,而不存储功能
要复制对象,请执行以下操作:
var team1=JSON.parse(JSON.stringify(cleanTeam))
这个技巧会创建一个指向内存中另一个地址的新对象,从而丢失对原始地址的引用
在你的情况下,这一个会起作用,但请记住Suren所说的:
它不会复制函数,因为JSON只存储状态,而不存储功能
“我使用cleanTeam创建了一个新对象:let team1=cleanTeam;
”-不,这只是引用同一对象的第二个变量。“我使用cleanTeam创建了一个新对象:let team1=cleanTeam;
”-不,这只是引用同一对象的第二个变量。关于JSON.parse(JSON.stringify())的好观点解决方案你完全正确!你提到的关键点是,如果一个对象中有一个对象。我正在使用Object.assign()
,我的cleanTeam
仍在更新,因为我的cleanTeam
位于另一个对象内。我简化了代码,使之易于理解。使用JSON.parse(JSON.stringify())
修复了这个问题。谢谢你的详细解释!关于JSON.parse(JSON.stringify())解决方案的观点很好,你完全正确!你提到的关键点是,如果一个对象中有一个对象。我正在使用Object.assign()
,我的cleanTeam
仍在更新,因为我的cleanTeam
位于另一个对象内。我简化了代码,使之易于理解。使用JSON.parse(JSON.stringify())
修复了这个问题。谢谢你的详细解释!