no-unreachable-loop
Запрещает циклы, тело которых допускает только одну итерацию
Цикл, который не может перейти ко второй итерации, может указывать на ошибку в коде.
for (let i = 0; i < arr.length; i++) {
if (arr[i].name === myName) {
doSomething(arr[i]);
// break was supposed to be here
}
break;
}
В редких случаях, когда одна итерация (или не более одной итерации) предусмотрена логикой программы, код следует переписать, используя условные конструкции if вместо циклов while, do-while и for. Считается хорошей практикой не использовать циклы в таких случаях.
Подробности правила
Это правило предназначено для обнаружения и запрета циклов, которые могут выполняться не более одного раза. Для этого оно выполняет статический анализ путей выполнения в телах циклов.
В частности, это правило запрещает циклы, тело которых завершает цикл при любом пути выполнения. Если все пути выполнения в теле цикла заканчиваются оператором break, return или throw, вторая итерация такого цикла заведомо недостижима независимо от условия цикла.
Это правило проверяет циклы while, do-while, for, for-in и for-of. При необходимости можно отключить проверки для каждой из этих конструкций.
Примеры неправильного кода для этого правила:
/*eslint no-unreachable-loop: "error"*/
function verifyList(head) {
let item = head;
}
function findSomething(arr) {
}
Примеры правильного кода для этого правила:
/*eslint no-unreachable-loop: "error"*/
while (foo) {
doSomething(foo);
foo = foo.parent;
}
function verifyList(head) {
let item = head;
do {
if (verify(item)) {
item = item.next;
} else {
return false;
}
} while (item);
return true;
}
function findSomething(arr) {
for (let i = 0; i < arr.length; i++) {
if (isSomething(arr[i])) {
return arr[i];
}
}
throw new Error("Doesn't exist.");
}
for (key in obj) {
if (key.startsWith("_")) {
continue;
}
firstKey = key;
firstValue = obj[key];
break;
}
for (foo of bar) {
if (foo.id === id) {
doSomething(foo);
break;
}
}
Обратите внимание, что это правило не предназначено для проверки условий циклов и не выдаёт предупреждений в следующих примерах.
Примеры дополнительного правильного кода для этого правила:
/*eslint no-unreachable-loop: "error"*/
do {
doSomething();
} while (false)
for (let i = 0; i < 1; i++) {
doSomething(i);
}
for (const a of [1]) {
doSomething(a);
}
Параметры
Это правило принимает объект с одним параметром:
-
"ignore"— необязательный массив типов циклов, которые будут игнорироваться этим правилом.
ignore
В массиве "ignore" можно указать до 5 различных элементов:
-
"WhileStatement"— игнорировать все циклыwhile. -
"DoWhileStatement"— игнорировать все циклыdo-while. -
"ForStatement"— игнорировать все циклыfor(не распространяется на циклыfor-inиfor-of). -
"ForInStatement"— игнорировать все циклыfor-in. -
"ForOfStatement"— игнорировать все циклыfor-of.
Примеры правильного кода для этого правила с параметром "ignore":
/*eslint no-unreachable-loop: ["error", { "ignore": ["ForInStatement", "ForOfStatement"] }]*/
for (let key in obj) {
hasEnumerableProperties = true;
break;
}
for (const a of b) break;
Известные ограничения
Статический анализ путей выполнения в общем случае не вычисляет условия. Поэтому это правило может не обнаружить такие случаи, как следующий:
for (let i = 0; i < 10; i++) {
doSomething(i);
if (true) {
break;
}
}
Связанные правила
Версия
Это правило появилось в ESLint v7.3.0.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-unreachable-loop