Spec-Zone.ru › ESLint

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. При необходимости можно отключить проверки для каждой из этих конструкций.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-unreachable-loop: "error"*/

while(foo){doSomething(foo);    foo = foo.parent;break;}

function verifyList(head) {
    let item = head;
    do{if(verify(item)){returntrue;}else{returnfalse;}}while(item);
}

function findSomething(arr) {
    for(let i =0; i < arr.length; i++){if(isSomething(arr[i])){return arr[i];}else{thrownewError("Doesn't exist.");}}
}

for(key in obj){if(key.startsWith("_")){break;}    firstKey = key;    firstValue = obj[key];break;}

for(foo of bar){if(foo.id === id){doSomething(foo);}break;}

Примеры правильного кода для этого правила:

Открыть в Playground
/*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;
    }
}

Обратите внимание, что это правило не предназначено для проверки условий циклов и не выдаёт предупреждений в следующих примерах.

Примеры дополнительного правильного кода для этого правила:

Открыть в Playground
/*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":

Открыть в Playground
/*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;
    }
}

Связанные правила

  • no-unreachable
  • no-constant-condition
  • no-unmodified-loop-condition
  • for-direction

Версия

Это правило появилось в ESLint v7.3.0.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-unreachable-loop

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API