для
for
петлі набагато ефективніші. Це циклічна конструкція, спеціально розроблена для повторення, тоді як умова є істинною , в той же час пропонує кроковий механізм (як правило, для збільшення ітератора). Приклад:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
Це не означає, що для -loops завжди буде ефективнішим, лише те, що JS-двигуни та браузери оптимізували їх таким чином. Протягом багатьох років виникали компроміси щодо того, яка конструкція циклічного циклу є більш ефективною (для, в той час, як зменшення, зворотний час тощо) - різні браузери та двигуни JS мають власні реалізації, які пропонують різні методики для отримання однакових результатів. Оскільки браузери додатково оптимізують відповідність вимогам продуктивності, теоретично це [].forEach
може бути реалізовано таким чином, щоб воно було швидшим або порівнянним з a for
.
Переваги:
- ефективний
- дострокове припинення циклу (відзнаки
break
та continue
)
- контроль стану (
i<n
може бути будь-яким, а не прив’язаним до розміру масиву)
- змінне масштабування (
var i
листки i
доступні після закінчення циклу)
для кожного
.forEach
- це методи, які в першу чергу ітераються над масивами (також над іншими переліченими, такими як Map
і Set
об'єкти). Вони новіші та надають код, який суб'єктивно легше читати. Приклад:
[].forEach((val, index)=>{
...
});
Переваги:
- не включає налаштування змінної (повторюється над кожним елементом масиву)
- Функції / стрілки-функції охоплюють змінну до блоку
У наведеному вище прикладі val
буде параметром новоствореної функції. Таким чином, будь-які змінні, викликані val
перед циклом, зберігали б свої значення після його закінчення.
- суб'єктивно більш рентабельний, оскільки може бути простіше визначити, що робить код - він перебирається на безліч; тоді як цикл for-циклу може використовуватися для будь-якої кількості циклів циклу
Продуктивність
Виступ - це хитра тема, яка, як правило, вимагає певного досвіду, коли йдеться про продуманість чи підхід. Для того, щоб заздалегідь визначити (під час розробки), яка оптимізація може знадобитися, програміст повинен мати гарне уявлення про досвід минулого з проблемою, а також добре розуміти потенційні рішення.
Використання jQuery в деяких випадках часом може бути занадто повільним (досвідчений розробник може це знати), тоді як інший час може бути проблемою, в іншому випадку відповідність перехресного браузера бібліотеці та простота виконання інших функцій (наприклад, AJAX, обробка подій) вартує економії часу на розробку (та обслуговування).
Інший приклад - якби продуктивність та оптимізація були все, не було б іншого коду, крім машини чи збірки. Очевидно, що це не так, оскільки існує багато різних мов високого та низького рівнів, кожен з яких має свої компроміси. Ці компроміси включають, але не обмежуються ними, спеціалізацію, простоту та швидкість розробки, простоту та швидкість обслуговування, оптимізований код, код без помилок тощо.
Підхід
Якщо ви не дуже добре розумієте, чи потрібно щось оптимізований код, це, як правило, спочатку правильне написання коду. Звідти ви можете перевірити і точно визначити, що потребує більшої уваги, коли цього потрібно.
Зважаючи на це, певні очевидні оптимізації повинні бути частиною загальної практики і не вимагати жодної думки. Наприклад, розглянемо наступний цикл:
for (var i=0; i < arr.length; ++i ){}
Для кожної ітерації циклу JavaScript arr.length
витягує операції калькуляції витрат ключа на кожному циклі. Немає причини, чому цього не повинно бути:
for (var i=0, n=arr.length; i < n; ++i){}
Це робить те саме, але витягується лише arr.length
один раз, кешуючи змінну та оптимізуючи ваш код.