首页 > 解决方案 > 分配和修改数组之间的区别

问题描述

我刚刚花了 2 天的时间在我的 angular2 项目代码中查找 bug 的位置,正在处理 service.ts 文件。我找到了!是的……不。我刚刚修好了。我在这里(在堆栈上)了解工作代码和错误代码之间的区别,因为在我看来它们的行为是相同的。

这是错误的:

for (let i = 0; i < quantita; i++) {
      this.a.p[inizio + i] = target;
    }

这是工作:

this.a.p = this.a.p.map((giorno, index) => {
      if (index >= inizio && index < inizio + quantita) {
        return target;
      } else {
        return giorno;
      }
    });

this.a 是一个引用数组的变量。错误是更改不仅影响数组的选定对象,而且还应用于另一个对象。我调试了几乎所有东西,this.a 是正确的实例,代码只被调用一次(应该如此)并且没有其他代码可以对对象进行此更改。

我想提供有关该问题的所有信息,如果没有请告诉我。

标签: javascriptangulartypescript

解决方案


当您在变量中保存一个数组时,您就保存了对该数组的引用。如果您更改数组中的值,所有引用都将“看到”更改:

let a = [1, 2, 3];
let b = a; // same array in a different variable
for(let i =0;i< a.length;i++) a[i] = a[i] *2;

console.log(a); // [2;3;6]
console.log(b); // [2;3;6]

如果您使用map一个新数组,将创建一个包含映射操作结果的数组:

let a = [1, 2, 3];
let b = a;
a = a.map(n => n * 2) // new array in a, b still has the same array

console.log(a); // [2;3;6]
console.log(b); // [1;2;3]

如果您创建一个新数组并推入该数组,您可以构建一个for不会更改原始数组的版本(尽管我强烈建议坚持使用,map我只是为了完整性而提出这个):

let a = [1, 2, 3];
let b = a; // same array in a different variable

let tmp = []
for(let i =0;i< a.length;i++) tmp.push(a[i] *2);
a = tmp;

console.log(a); // [2;3;6]
console.log(b); // [1;2;3]

推荐阅读