Во-первых, я должен сказать, что этот ответ написан в 2011 году, и эти вещи со временем меняются (поскольку браузерные интерпретаторы оптимизируют все больше и больше вещей), поэтому, если вы действительно хотите узнать текущее состояние мира, вам нужно запустить тесты в текущих браузерах.
Запустите свой собственный тест jsperf на любой версии IE. Там вы увидите постоянную разницу между этими двумя методами или многими другими старыми браузерами. Вы, очевидно, запускали его только на Chrome, который настолько быстр и оптимизирован, что разница между этими двумя методами ничтожна. В IE9 (который, вероятно, намного лучше, чем IE7 и IE8), метод, который предварительно кэширует длину, на 31% быстрее.
Тест jsperf, разработанный для этого вопроса дает количественные результаты по этому вопросу. В таких вопросах нужно просто обратиться к jsperf, чтобы увидеть реальную разницу, а не столько спекуляций.
Это показывает разницу в браузерах, которые я пробовал, которая варьируется от почти никакой разницы до довольно значительной разницы в зависимости от браузера. В Chrome различий почти нет. В IE9 сохранение длины сначала почти на 50% быстрее.
Теперь, имеет ли значение эта разница в скорости для ваших сценариев, зависит от конкретного кода. Если у вас был огромный массив, который вы часто просматривали, в некоторых браузерах могло бы иметь смысл использовать эту форму:
for (var i = 0, len = list.length; i < len; i++) {
// do code here
}
В слегка отличающемся тестовом примере при использовании живых псевдо-массивов, возвращаемых некоторыми функциями DOM, разница в скорости все же сохранялась, но не была увеличена (я ожидал, что разница в псевдо-жизни DOM будет больше массивы, но это не так).
На практике я склонен использовать короткую версию (меньше ввода), когда я не думаю, что мой раздел кода критичен по скорости, и / или массив не велик, и я бы использовал более длинную версию, которая предварительно кэширует длины, если я сознательно думаю о скорости, или массив огромен, или я делаю много итераций над одним и тем же массивом.
Есть пара других причин программирования для предварительного кэширования длины. Если вы будете добавлять элементы в конец массива во время цикла и не хотите, чтобы цикл перебирал эти вновь добавленные элементы, тогда вам НУЖНО предварительно загрузить длину и выполнять итерации только для первоначально представленных элементов. .
for (var i = 0, len = list.length; i < len; i++) {
if (list[i] == "whatever") {
list.push("something");
}
}
Имейте в виду, что браузеры постоянно развиваются и добавляют все больше и больше оптимизаций, так что оптимизация, которая принесет большую пользу в 2011 году, может быть в будущем встроена в более современный браузер, поэтому оптимизация с ручным кодом больше не нужна. Поэтому, если вы пытаетесь оптимизировать что-то для сегодняшней производительности, вам нужно протестировать в современных браузерах, вы не можете просто полагаться на прочитанные вами вещи, которым может быть несколько лет.