【发布时间】:2020-01-14 09:24:01
【问题描述】:
我在使用 TSlint 时遇到问题,并且了解为什么不再允许使用 for(i=0; ...) 循环。
假设我有一个简单的代码,例如:
this.filters['1','2','3'....];
for (let i = 0; i < this.filters.length; i++) {
if (this.filters[i] === '2') {
this.filters = new_value;
}
}
TSlint 要求我将其转换为 for-of。但是,使用 for-of 不起作用,因为我需要修改值并且 for-of 不允许修改。我可以使用类似
for (const [i, el] of this.filters.entries()) {
但随后我收到编译警告
TypeScript 和 Iterator:Type 'IterableIterator<T>' 不是数组类型
而且我必须更改编译选项。另外,我可以遍历keys(),我觉得for(const i=0...)有点愚蠢
谁能解释一下为什么 TSlint 仍然在抱怨这个以及为什么不允许使用 for(const i=0; ....)
此外,我刚刚看到如果在 for-of
中执行此代码this.filters['1','2','3'....];
for (let f of this.filters) {
if (f === '2') {
f = new_value;
}
}
我最终会得到相同的数组,因为它在循环之后没有被修改,但是,如果我有类似的方法但使用对象
let filters = [{id:'1'},{id:'2'},{id:'3'}];
console.log(filters)
for (let f of filters) {
if (f.id === '2') {
f.id = 'toto';
}
}
console.log(filters)
惊喜,我的对象数组在循环之后被修改了!谁能解释一下为什么?
谢谢
我搜索了错误,我在 github 中看到它是一个已关闭但我找不到解决方案的问题 https://github.com/palantir/tslint/pull/1813
【问题讨论】:
-
this.filters['1','2','3'....];你的意思是this.filters = ['1','2','3'....];? -
另外,为什么要项目的索引?看来您只关心每个项目的价值,所以
for-of似乎合适。 -
在迭代器的循环中使用 const 也很奇怪
-
如果数组中的任何值是
2,你想替换整个数组,但在相同的索引处继续迭代?这似乎很奇怪。 -
在迭代时修改数组是个坏主意,当您修改代码时,可能会出现许多错误。您实际上在做什么似乎没有意义,重新分配要迭代的整个数组?必须修改该代码的任何其他人都会讨厌您以这种方式编写它;)建议,创建一个新数组并修改/添加新项目。
标签: javascript typescript tslint for-of-loop