Можно ли создать цикл for без цикла?

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

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

  return false;
};

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

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

Ответы

Ответ 1

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

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;
};

Живой пример:

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

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

Ответ 2

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

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

  return false;
};

UPDATE: Это не работает, если список undefined.

Ответ 3

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

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

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

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

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

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

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

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

var firstVarIgnored = 1;
var secondVar = 2;
console.log(secondVar);