У великому проекті, над яким я працюю (я псевдокод), я знайшов таку анотацію циклу:
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]);
}
Але це змусило мене задуматися.
Чи є сценарій, коли написання такого циклу мало б сенс? Ідея приходить в голову, що довжина "масиву" може змінюватися під час виконання циклу, але ми не хочемо циклічити далі, ніж початковий розмір, але такого сценарію я не уявляю.
Скорочення масиву всередині циклу теж не має особливого сенсу, тому що ми, швидше за все, отримаємо OutOfBoundsException.
Чи існує відома модель дизайну, де ця примітка корисна?
Редагування Як зазначає @ Jerry101, причина - продуктивність. Ось посилання на створений мною тест на працездатність: http://jsperf.com/ninforloop . На мій погляд, різниця недостатньо велика, якщо ви не повторюєте, хоча це дуже великий масив. Код, з якого я скопіював, мав до 20 елементів, тому я вважаю, що читаемості в цьому випадку переважають над врахуванням продуктивності.
nможе бути повільнішим, ніж при використанні варіанту, array.Lengthоскільки JITter може не помітити, що він може усунути перевірку меж масиву.