eslint报错guard-for-in,应该怎么修改?

发布于 2022-09-07 23:01:22 字数 255 浏览 19 评论 0

 for (const i in this.keywords) {
        count += this.keywords[i].list.length;
      }
报错 The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype guard-for-in

这个应该怎么修改?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

兰花执着 2022-09-14 23:01:22

使用循环对对象进行for in循环将包括通过原型链继承的属性。此行为可能会导致for循环中出现意外的项目。

for (key in foo) {
    doSomething(key);
}

规则细节
此规则旨在防止在for in不对循环中的结果进行过滤的情况下使用循环可能产生的意外行为。因此,当for in循环不使用if语句过滤其结果时,它将发出警告。

以下模式被认为是问题:

/*eslint guard-for-in: 2*/

for (key in foo) {    /*error The body of a for-in should be wrapped in an if statement to filter     unwanted properties from the prototype.*/
    doSomething(key);
}

以下模式不被视为问题:

/*eslint guard-for-in: 2*/

for (key in foo) {
    if ({}.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}
输什么也不输骨气 2022-09-14 23:01:22

楼主这个似乎是在遍历 this.keywords数组,
数组遍历的话用 for-of, 当然也可以遍历对象的属性
但是 for-in 只能用来遍历对象属性,因为 数组其实是一个特殊的对象,所以它也能通过属性来访问他的元素,但这样的访问会带来意想不到的问题,所以题主,好好思考一下自己到底是要遍历什么?
改成:

for (i in this.keywords) {
  if(this.keywords.hasOwnProperty(i)){ //过滤一下对象原型上的方法, 至于一个对象为啥会有原型,你可以再开一个问题了
    count += this.keywords[i].list.length;
  }
}

更好的方案 阮一峰老师的ES6入门

for (i of this.keywords) {
  count += this.keywords[i].list.length;
}

另一方面想,也可以从eslint方面入手,禁用掉检查,但是其实这样做有悖于使用eslint,所以我比较建议写符合eslint规则的代码,并养成好的习惯,也能在书写时排查一些问题。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文