版本

guard-for-in

要求 for-in 循环包含 if 语句

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

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

对于不支持 ES2022 的代码库,可以使用 Object.prototype.hasOwnProperty.call(foo, key) 作为检查属性是否未继承的检查。

对于支持 ES2022 的代码库,可以使用 Object.hasOwn(foo, key) 作为更短的替代方案;请参阅 prefer-object-has-own

请注意,简单地检查 foo.hasOwnProperty(key) 在某些情况下可能会导致错误;请参阅 no-prototype-builtins

规则详细信息

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

此规则的错误代码示例

在游乐场中打开
/*eslint guard-for-in: "error"*/

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

此规则的正确代码示例

在游乐场中打开
/*eslint guard-for-in: "error"*/

for (key in foo) {
    if (Object.hasOwn(foo, key)) {
        doSomething(key);
    }
}

for (key in foo) {
    if (Object.prototype.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}

for (key in foo) {
    if ({}.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}

版本

此规则是在 ESLint v0.0.6 中引入的。

进一步阅读

资源

更改语言