分配和修改数组之间的区别

时间:2019-07-04 14:35:10

标签: javascript angular typescript

我只是花了2天的时间才能找到bug2在我的angular2项目的代码中的位置,并处理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是引用数组的变量。错误是更改不仅会影响数组的选定对象,而且还会影响另一个对象。 我调试了几乎所有东西,这是一个正确的实例,该代码仅被调用了一次(应该如此),并且没有其他代码对该对象进行了更改。

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

1 个答案:

答案 0 :(得分:4)

将数组保存在变量中时,将保留对该数组的引用。如果您更改数组中的值,则所有引用都会“看到”更改:

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]