Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08
Анализатор обнаружил вложенный цикл for, счётчик которого инициализируется значением счётчика внешнего цикла. Такой код часто содержит ошибку: скорее всего, обход надо начинать со следующего элемента (i + 1).
Рассмотрим пример:
function hasDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i; j < arr.length; j++) {
if (arr[i] === arr[j])
return true;
}
}
return false;
}
Функция должна проверять, есть ли в массиве повторяющиеся элементы. Однако вложенный цикл начинается с j = i, поэтому на первой же итерации элемент сравнивается сам с собой: выражение arr[i] === arr[i] всегда истинно, и функция вернёт true для любого непустого массива.
Исправленный вариант:
function hasDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j])
return true;
}
}
return false;
}
Анализатор также выдаст ошибку на следующий код:
function hasDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i; j < arr.length; j++) {
if (i !== j && arr[i] === arr[j])
return true;
}
}
return false;
}
В нём проверка i !== j выполняется на каждой итерации, хотя отсеивает лишь одну. В этом случае дополнительная итерация является избыточной, так как ветвление усложняет оптимизацию цикла компилятором.
Диагностическое правило классифицируется как:
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: