Я нашел следующую аннотацию цикла в большом проекте, над которым я работаю (псевдокод):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Что привлекло мое внимание, так это дополнительная «n» переменная. Я никогда раньше не видел написанного таким образом.
Очевидно, что в этом сценарии нет причин, по которым этот код не может быть написан следующим образом (к которому я очень привык):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Но это заставило меня задуматься.
Есть ли сценарий, когда написание такого цикла for имело бы смысл? Идея приходит в голову, что длина «массива» может измениться во время выполнения цикла for, но мы не хотим зацикливаться дальше, чем исходный размер, но я не могу представить себе такой сценарий.
Сокращение массива внутри цикла также не имеет особого смысла, потому что мы, вероятно, получим исключение OutOfBoundsException.
Есть ли известный шаблон проектирования, где эта аннотация полезна?
Редактировать Как отмечает @ Jerry101, причина в производительности. Вот ссылка на созданный мной тест производительности: http://jsperf.com/ninforloop . На мой взгляд, разница не достаточно велика, если вы не выполняете итерацию, хотя очень большой массив. Код, из которого я скопировал его, содержал до 20 элементов, так что я думаю, что читаемость в этом случае перевешивает оценку производительности.
nможет быть медленнее, чем использование варианта, array.Lengthпоскольку JITter может не заметить, что он может устранить проверки границ массива.