Можно ли создать цикл for без переменной? - PullRequest
0 голосов
/ 05 октября 2018

Предположим, у меня есть такая функция:

const hasAny = xs => {
  for (const x of xs) {
    return true;
  }

  return false;
};

будет жаловаться, что x не используется, и действительно, это не так.

Могу ли я написать цикл for, который не объявляет переменные?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вы можете использовать деструктуризацию с пустым объектом:

const hasAny = xs => {
  for (const {} of xs) {
    return true;
  }

  return false;
};

ОБНОВЛЕНИЕ: Это не работает, если список содержит undefined.

0 голосов
/ 05 октября 2018

В соответствии с проблемой ESLint # 2173 , вы можете установить комментарий, чтобы игнорировать неиспользуемую переменную.Для этого используйте следующий код:

var some_unused_variable; // eslint-disable-line no-unused-vars

Член сообщества ESLint также заявляет:

Теперь у нас есть опция varsIgnorePattern, доступная дляэтот вариант использования (лучше всего подходит для игнорирования определенных неиспользуемых имен переменных или шаблонов во всех ваших файлах).

И в документации говорится:

Параметр varsIgnorePattern указывает исключения, которые не нужно проверятьдля использования: переменные, имена которых соответствуют шаблону регулярных выражений.Например, переменные, имена которых содержат игнорируемые или игнорируемые.

Примеры правильного кода для параметра {"varsIgnorePattern": "[iI] gnored"}:

/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/

var firstVarIgnored = 1;
var secondVar = 2;
console.log(secondVar);
0 голосов
/ 05 октября 2018

Нет, вы не можете, не в общем случае. The Вы можете использовать итератор² напрямую, хотя:

const hasAny = xs => !xs[Symbol.iterator]().next().done;

Или, если вы хотите обеспечить активное освобождение любых ресурсов, которые удерживает итератор (вместо того, чтобы ждать их автоматического освобождения - подумайте о соединении с БД в функции генератора или подобном), предварительно вызовите return для него, если он предоставляет return (не все делают), как for-of делает под прикрытием:

const hasAny = xs => {
    const it = xs[Symbol.iterator]();
    const result = !it.next().done;
    if (it.return) it.return();
    return result;
};

Live Пример:

const hasAny = xs => !xs[Symbol.iterator]().next().done;

console.log(hasAny([]));  // false
console.log(hasAny([1])); // true

¹ Если вы точно знаете, что первое значение итератора не будет null или undefined, вы можете сделать этот трюк с деструктуризацией .

² Для тех, кто не знает, for-of использует итератор под одеялом.

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