Свойство length не вычисляется при каждом вызове, но последняя версия будет быстрее, поскольку вы кэшируете поиск свойства. Даже при использовании самых современных реализаций JS (V8, TraceMonkey, SquirrelFish Extreme), в которых используется расширенное (например, SmallTalk era;)), кэширование поиска свойства по крайней мере на одну дополнительную условную ветвь больше, чем ваша вторая версия.
Array.length не постоянна, так как массивы JS являются изменяемыми, поэтому push, pop, array[array.length]=0, etc
может изменить его.
Существуют и другие концепции, такие как DOM NodeList
s, которые вы получаете от вызовов типа document.getElementsBySelector
, которые, как ожидается, будут активными, и в этом случае длина может быть пересчитана при итерации. Но затем, если длина будет пересчитана, есть большая вероятность, что она также действительно изменится, поэтому ручное кэширование вывода может быть недопустимым.