进行修改时,期望使用“ for-of”循环而不是“ for”循环

时间:2019-09-12 13:23:43

标签: javascript typescript tslint for-of-loop

我遇到了 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 。但是,使用 for-of 无效,因为我需要修改值,并且for-of不允许修改。我可以使用类似

for (const [i, el] of this.filters.entries()) { 

但是我得到一个编译警告 TypeScript 和迭代器:类型'IterableIterator<T>'不是数组类型 而且我必须更改编译选项。另外,我可以遍历keys(),因为我发现for(const i=0...)

有点愚蠢

有人可以向我解释为什么 TSlint 仍然对此抱怨,为什么不允许使用for(const i=0; ....)

此外,我刚刚看到,如果在 for

中执行此代码
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

1 个答案:

答案 0 :(得分:1)

使用字符串,您将得到以下结果:

字符串已分配给f。然后,将新值重新分配给ff === '2'。但是数组中的字符串没有被触及。

带有对象:

对对象的引用已分配给f。然后修改对象:f.id = 'toto'。由于数组仅包含对对象的引用-我们在数组中获得了修改后的对象。

基本上,答案以引用类型变量和值类型变量之间的差异结尾。

在您的情况下,如果for (const [i, el] of this.filters.entries()) {由于ts设置而无法使用,则可以尝试:

arr.forEach((entry, index) => arr[index] = ...);

或更难看:

for(entry of arr) {
    arr[arr.indexOf(entry)] = ...;
}