如何避免...在拖欠款问题上?

时间:2018-08-29 20:23:30

标签: javascript eslint

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

我最初有这个循环:

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

那给了我下面的错误提示:

  

for..in循环遍历整个原型链,而这实际上从来都不是您想要的。使用Object。{keys,values,entries},然后遍历结果数组。 (无限制语法)

所以我将其更改为:

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

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

  

请勿从目标对象访问Object.prototype方法'hasOwnProperty'。 (无原型内置)

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

3 个答案:

答案 0 :(得分:3)

使用Object.keys时,不需要检查hasOwnProperty。 Object.keys产生一个专有属性数组。这就是为什么第一个eslint错误建议您使用它的原因。

对于第二个皮棉错误,建议您

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

存在该规则的原因是,如果使用commands.hasOwnProperty创建了命令,则undefined可能是Object.create(null)。不过,就您而言,您只需要删除支票即可:

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

答案 1 :(得分:0)

Object.keys()仅收集对象自己的属性。无需进行hasOwnProperty检查。删除它可以解决第二个片段的问题。

如果您知道自己在做什么/仍然偏爱for-in,则始终可以在导致错误的行之前添加//eslint-disable-next-line行,以单独禁用该行的拖延警告。

答案 2 :(得分:0)

首先,如果不需要,可以禁用eslint规则。如其声明,for...in将遍历继承的属性,因此通常与hasOwnProperty结合使用,但是新的Object.keys语法较短。

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

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