【问题标题】:How to avoid for...in eslint issues?如何避免 for...in eslint 问题?
【发布时间】:2019-02-04 17:17:32
【问题描述】:

我有一个带有一些键和值的对象。

我最初有这个循环:

  for(const key in commands) {
    if (commands.hasOwnProperty(key)) {
      const value = commands[key];
      // Do something else
    }
  }

这给了我以下 eslint 错误:

for..in 循环遍历整个原型链,这几乎不是您想要的。使用 Object.{keys,values,entries},并遍历生成的数组。 (无限制语法)

所以我把它改成了这样:

  Object.keys(commands).forEach(key => {
    if (commands.hasOwnProperty(key)) {
      const value = commands[key];
    }
  });

现在,由于hasOwnProperty,我收到以下错误:

不要从目标对象访问 Object.prototype 方法“hasOwnProperty”。 (无原型内置)

如何编写一个简单的循环来遍历键,同时避免 eslint 错误?

【问题讨论】:

  • 不要使用Object.keys(commands).forEach(key => {。如果有的话,请使用for (const key of Object.keys(commands)) {

标签: javascript eslint


【解决方案1】:

使用Object.keys时,无需勾选hasOwnProperty。 Object.keys 生成一组专有属性。这就是为什么第一个 eslint 错误建议你使用它的原因。

对于第二个 lint 错误,建议您这样做

Object.prototype.hasOwnProperty.call(commands, key)

存在此 lint 规则的原因是,如果命令是使用 Object.create(null) 创建的,commands.hasOwnProperty 可能是 undefined。不过,在您的情况下,您只需要删除检查:

Object.keys(commands).forEach(key => {
  const value = commands[key];
  // Do something else
});

【讨论】:

    【解决方案2】:

    首先,如果不需要,可以禁用 eslint 规则。正如它所说,for...in 将迭代继承的属性,因此它经常与hasOwnProperty 结合使用,但新的Object.keys 语法更短。

    其次,如果您使用的是Object.keys,则不需要hasOwnProperty。它只迭代了自己的属性。

    第三,eslint 不喜欢你在对象上使用hasOwnProperty,因为它可以重新分配为不同的函数。我想如果你真的需要它,它希望你使用Object.prototype.hasOwnProperty.call(object, key),但我认为在很多情况下你知道使用较短的版本是安全的。同样,如果您知道其中的含义,您可以禁用该规则。

    【讨论】:

    • 在所有可以安全使用较短版本的情况下,您几乎也知道该对象没有可枚举的继承属性,那么为什么要使用它呢?
    • 这在处理for..in 循环时通常是正确的,因为它只列出可枚举的属性,如果你的Object 原型上有任何可枚举的东西,就会出现严重错误。但是如果你需要检查一个对象是否有某个字段,hasOwnProperty 会很有用。
    【解决方案3】:

    Object.keys() 只收集对象自身的属性。无需进行hasOwnProperty 检查。删除它可以解决第二个 sn-p 的问题。

    如果你知道你在做什么/更喜欢for-in,你总是可以在导致错误的行之前添加//eslint-disable-next-line,以单独禁用该行的eslint警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 2018-04-02
      • 2011-05-14
      • 2021-02-20
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多