Javascript 为什么变异一个属性(对象)在另一个单独声明的属性中也会发生变化?

Javascript 为什么变异一个属性(对象)在另一个单独声明的属性中也会发生变化?,javascript,angular,mutation,Javascript,Angular,Mutation,我有两个这样声明的属性: ngOnInit() { this.defaultRequirements = myData.property1.countryDocument; //should never change this.filteredRequirements = myData.property1.countryDocument; } 当我运行这个onFilter函数时,defaultRequirements属性也会发生变化 onFilter(selectedSections) {

我有两个这样声明的属性:

ngOnInit() {
this.defaultRequirements = myData.property1.countryDocument; //should never change
this.filteredRequirements = myData.property1.countryDocument; 
}
当我运行这个onFilter函数时,defaultRequirements属性也会发生变化

onFilter(selectedSections) {
    let index = -1;

    this.defaultRequirements.forEach(country => {
      index++;
      const filteredSectionsList = [];

      country.section.forEach(section => {
        selectedSections.value.forEach(selectedSelection => {
          const selection = selectedSelection.split(/\s*[-]\s*/);  

          if (country.countryCode === selection[0]) {
            console.log('matched');
            filteredSectionsList.push(section);
          }
        });

        const countryObj = Object.assign({}, country, {
          section: [...filteredSectionsList]
        })

// Here is the issue, when filtering, this.defaultRequirements also gets changed!
        this.filteredRequirements[index] = countryObj;


      })
    })
}

问题

我不明白改变this.filteredRequirements是如何改变this.defaultRequirements的(它们都等于同一个东西)!如何避免这种行为并使defaultRequirements不受对FiltereRequirements所做更改的影响?

尝试以下方法:

ngOnInit() {
    this.defaultRequirements = JSON.parse(JSON.stringify(myData.property1.countryDocument));   
    this.filteredRequirements = JSON.parse(JSON.stringify(myData.property1.countryDocument));
}

试试这个:

ngOnInit() {
    this.defaultRequirements = JSON.parse(JSON.stringify(myData.property1.countryDocument));   
    this.filteredRequirements = JSON.parse(JSON.stringify(myData.property1.countryDocument));
}


好的,那么您声明的对象myData.property1.countryDocument是一个非原语/参考值。这意味着
this.defaultRequirements
this.filteredRequirements
都指向同一个数据段

如果使用原语值(例如:a
string
)执行此操作,您将获得一个副本;因此,
this.defaultRequirements
this.filteredRequirements
将是完全独立的,可以相互操作而不产生任何影响


以您想要的方式复制/复制一个对象是完全可能的,并且已经有很多关于它的讨论,我不会复制;我建议哪一个可以很好地覆盖它。

好的,那么您声明的对象
myData.property1.countryDocument
是一个非原始/参考值。这意味着
this.defaultRequirements
this.filteredRequirements
都指向同一个数据段

如果使用原语值(例如:a
string
)执行此操作,您将获得一个副本;因此,
this.defaultRequirements
this.filteredRequirements
将是完全独立的,可以相互操作而不产生任何影响


以您想要的方式复制/复制一个对象是完全可能的,并且已经有很多关于它的讨论,我不会复制;我建议哪种方法能很好地涵盖它。

它们都指向同一对象,它们都指向同一对象。第一种方法在所有浏览器中都受支持,但第二种方法在IE浏览器中不受支持@Kode_12所有浏览器都支持第一种方法,但IE浏览器不支持第二种方法@科德欧12