Подтвердить что ты не робот

Для цикла вместо цикла while

Чтение через источник jQuery Я наткнулся на следующий фрагмент кода (доступный здесь):

for (; i < length;) {
    if (callback.apply(object[i++], args) === false) {
        break;
    }
}

Почему здесь используется цикл for вместо цикла while?

4b9b3361

Ответ 1

Я проголосую за кого-то, кто сродни плохому стилю кодирования. Это единственное объяснение, которое я вижу как для цикла for, так и для i++, размещенного внутри индекса массива. Я думаю, это было бы лучше:

while (i < length && callback.apply(object[i], args)) {
    i++;
}

Или, если вам кажется, что оператор === в исходном примере имеет значение, то:

while (i < length && callback.apply(object[i], args) !== false) {
    i++;
}

Другой возможной причиной для этого может быть оптимизация производительности. Хотя этот быстрый тест, который я собрал, кажется, опровергает эту теорию. В Windows цикл while выше на 20% быстрее, чем исходный цикл for в Chrome, в IE и Firefox оба цикла выполняют то же самое. В OS X цикл for имеет 10% -ное преимущество в Firefox, в Chrome нет разницы между ними, а Safari предпочитает цикл while на 6%.

Итак, с точки зрения производительности это стирка. Если что-то, судя по рыночной доле, вы, вероятно, захотите оптимизировать для Chrome в Windows перед оптимизацией для Firefox на Mac, в этом случае предпочтительным будет цикл while.

Что говорит мне, что маловероятно, что оптимизация производительности сыграла роль в этом коде. И я возвращаюсь к своей первоначальной теории, что это всего лишь пример плохого стиля кодирования, заставляющий его пройти процесс обзора кода.

Ответ 3

Вот комманда, которая ввела эту странность.

Сообщение об ошибке:

jquery core: сокращение кода в $.each и $.curCSS.

Снимите с diff:

-        for ( var i = 0, length = object.length; i < length; i++ )
-          if ( callback.apply( object[ i ], args ) === false )
+        for ( ; i < length; )
+          if ( callback.apply( object[ i++ ], args ) === false )

Похоже, что автор просто упустил возможность изменить for на while.

Ответ 4

Во-первых, никогда не бывает затрат на длину цикла for в цикле while, но вы получаете дополнительные функции с циклом for, поэтому некоторые кодеры всегда используют for:

for(;<condition>;){}
while(<condition>){}

Тем не менее, я думаю, что цель здесь может заключаться в согласованности с окружающим кодом.

Например, вот часть исходного кода. Как вы можете видеть, в этом коде вы можете оставаться в режиме "за" цикл мышления все время, поэтому он чувствует себя более последовательным:

if (args) {
    if (isObj) {
        for (name in object) {
            if (callback.apply(object[name], args) === false) {
                break;
            }
        }
    } else {
        for (; i < length;) {
            if (callback.apply(object[i++], args) === false) {
                break;
            }
        }
    }
}

Сравните это с заменой второго цикла на while. Когда вы читаете этот код, вам нужно переключиться из режима мышления "за" в режим мышления "while". Теперь я не знаю о вас, но я нахожу это немного быстрее, чтобы мои глаза переключались между условиями цикла выше, а не условиями цикла ниже. Это связано с тем, что в приведенном выше случае я могу просто сосредоточиться на условиях, тогда как в нижнем случае мои глаза рисуются, чтобы перечитать while и for каждый раз, потому что они различны:

if (args) {
    if (isObj) {
        for (name in object) {
            if (callback.apply(object[name], args) === false) {
                break;
            }
        }
    } else {
        while (i < length) {
            if (callback.apply(object[i++], args) === false) {
                break;
            }
        }
    }
}

Ответ 5

Я обнаружил, что такие вещи происходят, когда я переписываю вещи или несколько людей касаются части кода. Не вижу особых причин для этого.

Я надеюсь, что i будет правильно инициализирован над этим блоком.

Ответ 6

Самый короткий и самый честный ответ довольно короткий "просто потому, что". Для этого нет никаких практических оснований, мы не получаем никакой прибыли от такой петли с двумя улыбками.

В соответствии с вышеупомянутыми причинами, такими как:

  • рефакторинг - что наиболее возможно, но, тем не менее, это не оправдание.
  • соображения минимизации - что меньше, менее возможно.
  • психологическая/читаемость/поддержка кода - я очень сомневаюсь в том, что кто-то пишет такой код, имея в виду, что пользователя можно путать для некоторых конструкций кода и свободной концентрации;

ну, по этим причинам - все они определенно стоит упомянуть, но, честно говоря, стиль jquery-кода, ну, не идеален. Иногда там есть причины, почему это так, иногда, это просто факт.

Производственный код не всегда самый красивый код. Чтение готового, хардкорного кода на любом языке всегда хорошо, но не 100% от стиля кода. Скажем, vim - это красивое, очень мощное программное обеспечение, но (как для меня) некоторые пуристы могут быть удивлены его исходным кодом. Хотя циклы вещи нормально))))

Ответ 7

Итак, t будет запускаться хотя бы один раз, потому что если вы используете цикл while, если логика ложна, он не будет работать. Для lopp, даже если он ложный, он будет запускаться по крайней мере один раз.