进行修改时需要 'for-of' 循环而不是 'for' 循环
Expected a 'for-of' loop instead of a 'for' loop while doing modifications
我在使用 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 和迭代器:类型 '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
使用字符串,您将获得以下内容:
字符串已分配给 f
。然后将新值重新分配给 f
:f === '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)] = ...;
}
我在使用 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 和迭代器:类型 '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
使用字符串,您将获得以下内容:
字符串已分配给 f
。然后将新值重新分配给 f
:f === '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)] = ...;
}