首页 > 解决方案 > 函数抛出 eslint.org guard-for-in 错误

问题描述

使用这个 for 循环来构建一个没有问题的查询字符串。

  for (const key in parameters) {
    const value = parameters[key];
    qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}&`;
  }

直到现在我注意到 ESLint 的红色衬里。该文档说明了以下内容:

https://eslint.org/docs/rules/guard-for-in

/*eslint guard-for-in: "error"*/

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

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

~

标签: javascripteslint

解决方案


只需像这样将代码包装在 for 循环中

for (const key in parameters) {
    if (!parameters.hasOwnProperty(key)) { continue; }
    const value = parameters[key];
    qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}&`;
}

parameters.hasOwnProperty(key)检查对象中是否存在属性/键parameters

但这可能仍然不是您想要的,因为 eslint 现在说:for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.eslintno-restricted-syntax

正如那里所建议的,这 lints 干净:

  Object.keys(parameters).forEach((key) => {
    const value = parameters[key];
    qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}&`;
  });

推荐阅读