javascript - 分配和修改数组之间的区别
问题描述
我刚刚花了 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 是正确的实例,代码只被调用一次(应该如此)并且没有其他代码可以对对象进行此更改。
我想提供有关该问题的所有信息,如果没有请告诉我。
解决方案
当您在变量中保存一个数组时,您就保存了对该数组的引用。如果您更改数组中的值,所有引用都将“看到”更改:
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]
推荐阅读
- c# - 在 C# 中使用 lambda 进行内部连接
- c# - 为什么UWP项目的Application类有构造函数,而WPF项目的Application类没有?
- html - 如何让两张照片并排放置?
- celery - 带有芹菜的气流安装 - 任务失败而不执行它 - 引发 AirflowException('Celery 命令失败')
- php - php 上的 system() 和 exec() 挂起
- reactjs - 通过单击按钮使用 react/redux 重定向到结果页面
- html - 使用 flexbox 和 hack 之前的嵌套网格布局
- css - Angular Material:如何更改垫子微调器路径的背景颜色
- java - Android JNI RegisterNatives:对所有内容调用一次,或每个函数调用一次
- java - Apache James Spring 发行版未启动