Javascript 为什么父列表对象';当我处理新列表时,s属性得到更新

Javascript 为什么父列表对象';当我处理新列表时,s属性得到更新,javascript,Javascript,我有两份清单: parentList = [{ name: "Item1", flag: true }, { name: "Item2", flag: true }, { name: "Item3", flag: true }]; childList = []; 我正在将已单击的项从父列表推送到子列表数组中 这很好,但是当我从childList中删除一个项目并且如果我更改parentList的属性时: 在父列表上单击: this.childList.push(item); 在子列表中,单击

我有两份清单:

parentList = [{ name: "Item1", flag: true }, { name: "Item2", flag: true }, { name: "Item3", flag: true }];

childList = [];
我正在将已单击的项从父列表推送到子列表数组中

这很好,但是当我从childList中删除一个项目并且如果我更改parentList的属性时:

在父列表上单击:

this.childList.push(item);
在子列表中,单击删除:

var index = this.childList.indexOf(item);
this.childList.splice(index, 1)
item.flag = false;
该项已从子列表中删除,但当我控制台parentList的值时,它会为标志键提供
false

无法理解为什么要更改父列表的属性值


它更改parentList上的属性,因为您正在传递对象的引用

引用指向同一对象,它不是副本

您可以复制对象,并将该副本放在第二个列表中,如果您打算这样做的话

JSON.parse(JSON.stringify(item))

在子列表中推送项目时,插入的是同一对象。 当您这样做时:

var object1=新对象();
var object2=object1

你没有将对象复制到另一个变量中,而是复制它的引用,这是一种用于在计算机内存中定位对象的地址。 因为它们具有相同的引用,所以这两个变量会将您引导到内存中的相同对象

从列表中获取对象并将其推入另一个列表时也会发生同样的情况。 你在引用,然后把引用放在另一个列表中

所以需要传递两个完全不同的对象。您可以使用以下方法创建要传递的对象的副本:

  • 让newObj=Object.assign({},yourObj)
    ,它基本上获取“youObj”的所有属性,并将它们复制到新对象“{}”,然后返回这个新对象。但这仅在属性未嵌套时有效
  • 让newObj=JSON.parse(JSON.stringify(yourObj))
    ,它创建对象的JSON字符串,然后使用相同的字符串将对象重新创建为新对象(JSON是表示Javascript对象的字符串格式)

可能是因为项目是通过引用复制的?如果我理解您的查询,您就不想“改变”父列表-如果是这样,您需要克隆该项,这样当您更改它时,它就不会更新(改变)原始列表。@PhilCooper感谢您提供更详细的信息?或文档来获得差异?好的,只处理列表和它通过引用复制的对象?@PrashantPimpale基本上,Javascript中不是数字、字符串或布尔值的所有内容都被视为对象。列表(JavaScript中的数组)也是对象。函数也是通过引用传递的。基本上,可以放入非原语的var中的所有内容都作为引用传递。