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

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

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

Открыть в 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

Вы можете указать до 5 различных элементов в массиве "ignore":

  • "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 (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;
    }
}

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

  • 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