Как избежать ... в вопросах eslint? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть объект с некоторыми ключами и значениями.

У меня изначально был этот цикл:

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

Это дало мне следующую ошибку eslint:

for..in циклы повторяются по всей цепочке прототипов, что практически никогда не является тем, что вы хотите. Используйте Object. {Ключи, значения, записи} и выполняйте итерацию по полученному массиву. (Не-ограниченного синтаксиса)

Итак, я изменил это на:

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

Теперь я получаю следующую ошибку из-за hasOwnProperty:

Не обращаться к методу Object.prototype 'hasOwnProperty' из целевого объекта. (Не-прототип-встроенные команды)

Как мне написать простой цикл, который перебирает ключи, избегая ошибок eslint?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

При использовании Object.keys вам не нужно проверять hasOwnProperty. Object.keys создает массив исключительно собственных свойств. Вот почему первая ошибка eslint рекомендовала использовать его.

Для второй ошибки ворса, рекомендуется сделать

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

Причина, по которой существует это правило lint, заключается в том, что commands.hasOwnProperty может быть undefined, если команды были созданы с использованием Object.create(null). В вашем случае, однако, вам просто нужно удалить чек:

Object.keys(commands).forEach(key => {
  const value = commands[key];
  // Do something else
});
0 голосов
/ 29 августа 2018

Прежде всего, вы можете отключить правило eslint, если оно вам не нужно. Как говорится, for...in будет перебирать наследуемые свойства, поэтому его часто использовали в сочетании с hasOwnProperty, но новый синтаксис Object.keys короче.

Во-вторых, вам не нужно hasOwnProperty, если вы используете Object.keys. Он уже перебирает только собственные свойства.

В-третьих, eslint не нравится, когда вы используете hasOwnProperty для объекта, потому что он может быть переназначен на другую функцию. Я думаю, он хочет, чтобы вы использовали Object.prototype.hasOwnProperty.call(object, key), если вам это действительно нужно, но я бы сказал, что есть много случаев, когда вы знаете, что безопаснее использовать более короткую версию. Опять же, вы можете отключить правило, если вы знаете последствия.

0 голосов
/ 29 августа 2018

Object.keys() собирает только собственные свойства объекта. Нет необходимости делать hasOwnProperty проверку для этого. Удаление этого исправит проблему со вторым фрагментом.

Если вы в любом случае знаете, что делаете / предпочитаете for-in, вы всегда можете добавить //eslint-disable-next-line строку перед строкой, которая вызывает ошибки, чтобы отключить предупреждения eslint только для этой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...