Можно ли создать цикл for без цикла?
Предположим, что у меня есть такая функция:
const hasAny = xs => {
for (const x of xs) {
return true;
}
return false;
};
eslint будет жаловаться на то, что 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);