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 (var 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
Вы можете указать до 5 различных элементов в массиве "ignore":
-
"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 (var 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