Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象赋值正在更改值_Javascript - Fatal编程技术网

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())
修复了这个问题。谢谢你的详细解释!