我只是花了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是引用数组的变量。错误是更改不仅会影响数组的选定对象,而且还会影响另一个对象。 我调试了几乎所有东西,这是一个正确的实例,该代码仅被调用了一次(应该如此),并且没有其他代码对该对象进行了更改。
如果不告诉我,我想提供有关该问题的所有信息。
答案 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]