Javascript 为什么子数组/对象上的属性设置为其最高索引同级的值?

Javascript 为什么子数组/对象上的属性设置为其最高索引同级的值?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个类定义的对象,它包含另一个类定义对象的数组。 子类定义的对象有一个来自全局对象数组的对象数组 在下面的代码片段中,我希望出现以下情况: 项目#0:柜台:1 项目#0:柜台:2 项目#0:柜台:3 项目#1:柜台:4 项目#1:柜台:5 项目#1:柜台:6 第2项:柜台:7 第2项:柜台:8 第2项:柜台:9 但是,下面的代码段会生成输出: 项目#0:柜台:7 项目#0:柜台:8 项目#0:柜台:9 项目#1:柜台:7 项目#1:柜台:8 项目#1:柜台:9 第2项:柜台:7 第2项

我有一个类定义的对象,它包含另一个类定义对象的数组。 子类定义的对象有一个来自全局对象数组的对象数组

在下面的代码片段中,我希望出现以下情况:

  • 项目#0:柜台:1
  • 项目#0:柜台:2
  • 项目#0:柜台:3
  • 项目#1:柜台:4
  • 项目#1:柜台:5
  • 项目#1:柜台:6
  • 第2项:柜台:7
  • 第2项:柜台:8
  • 第2项:柜台:9
但是,下面的代码段会生成输出:

  • 项目#0:柜台:7
  • 项目#0:柜台:8
  • 项目#0:柜台:9
  • 项目#1:柜台:7
  • 项目#1:柜台:8
  • 项目#1:柜台:9
  • 第2项:柜台:7
  • 第2项:柜台:8
  • 第2项:柜台:9
不知何故,ItemObj.myData的早期迭代被更新的记录所取代

为什么会发生这种情况?更重要的是,我如何避免这种情况并获得预期的结果

const NUMBER_OF_ITEMS=3;
const数组_OF_OBJ=[{“id”:1,“color”:“red”},{“id”:2,“color”:“green”},{“id”:3,“color”:“blue”}];
设全局_计数器=0;
类项目管理器{
构造函数(){
此项。项=[];
for(设i=0;i<项的个数;i++){
这个.Items.push(新的ItemObj(i));
}
}  
}
类ItemObj{
构造函数(标识符){
this.id=标识符;
this.myData=[];
这是getValues();
}
getValues(){
for(设i=0;i<数组的长度;i++){
设myObj=Object.assign(数组_OF_OBJ[i]);
全局_计数器++;
myObj.counter=全局计数器;
this.myData.push(myObj);
}
}
}
//实例化并显示
const IM=新项目管理器();
对于(让项目成为IM.项目中的一项){
for(let Item.myData的数据){
$(“#输出”).append(`li style=“color:${data.color}>Item{Item.id}:Counter:${data.Counter}`);
}
}


    您从对象数组的
    数组中的3个对象开始,每当调用
    getValues
    时,这些对象会被多次引用:

    let myObj = Object.assign(ARRAY_OF_OBJ[i]);
    
    但你的记忆中仍然只有3个对象;
    myObj
    只是指向这三个对象中的一个

    将单个对象传递给
    对象。分配
    会产生相同的对象-它不会克隆它:

    constobj={};
    const obj2=对象分配(obj);
    console.log(obj==obj2)使用

    让myObj=Object.assign({},数组_OF_OBJ[i])

    而不是

    让myObj=Object.assign(数组_OF_OBJ[i])

    as
    Object.assign()
    将引用同一个对象,除非您提供空对象作为第一个参数。提供空对象作为第一个参数将创建新对象,并将作为第二个参数提供的对象复制到该对象

    但请记住,它仍然是一个肤浅的副本;嵌套对象仍将存储为引用

    
    
      常数项的数量=3; const数组_OF_OBJ=[{“id”:1,“color”:“red”},{“id”:2,“color”:“green”},{“id”:3,“color”:“blue”}]; 设全局_计数器=0; 类项目管理器{ 构造函数(){ 此项。项=[]; for(设i=0;i<项的个数;i++){ 这个.Items.push(新的ItemObj(i)); } } } 类ItemObj{ 构造函数(标识符){ this.id=标识符; this.myData=[]; 这是getValues(); } getValues(){ for(设i=0;i<数组的长度;i++){ 设myObj=Object.assign({},数组_OF_OBJ[i]); 全局_计数器++; myObj.counter=全局计数器; this.myData.push(myObj); } } } //实例化并显示 const IM=新项目管理器(); 对于(让项目成为IM.项目中的一项){ for(let Item.myData的数据){ $(“#输出”).append(`li style=“color:${data.color}>Item{Item.id}:Counter:${data.Counter}`); } }