为了账号安全,请及时绑定邮箱和手机立即绑定

进行修改时需要“for-of”循环而不是“for”循环

进行修改时需要“for-of”循环而不是“for”循环

慕后森 2021-10-14 14:13:09
我在使用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
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

使用字符串,您将获得以下信息:


字符串分配给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)] = ...;

}


查看完整回答
反对 回复 2021-10-14
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信