Иногда внесение очень незначительных изменений в способ написания нашего кода может существенно повлиять на скорость выполнения нашего кода. Одна область, где незначительное изменение кода может иметь большое значение для времени выполнения, - это то, где у нас есть цикл for, который обрабатывает массив. Если массив состоит из элементов на веб-странице (например, переключателей), изменение имеет наибольший эффект, но все же стоит применить это изменение, даже если массив является внутренним по отношению к коду Javascript.
Обычный способ кодирования цикла for для обработки массива lis выглядит так:
for (var i = 0; i < myArray.length; i++) {...
Проблема в том, что для оценки длины массива с использованием myArray.length требуется время, а способ, которым мы закодировали цикл, означает, что эта оценка должна выполняться каждый раз вокруг цикла. Если массив содержит 1000 элементов, длина массива будет оценена 1001 раз. Если бы мы смотрели на переключатели и имели myForm.myButtons.length, то это займет еще больше времени для оценки, поскольку соответствующая группа кнопок в указанной форме должна сначала быть найдена, прежде чем можно будет оценивать длину каждый раз вокруг цикла.
Очевидно, мы не ожидаем, что длина массива изменится, пока мы его обрабатываем, поэтому все эти пересчеты длины просто без необходимости прибавляют время обработки. (Конечно, если у вас есть код внутри цикла, который добавляет или удаляет записи массива, то размер массива может меняться между итерациями, и поэтому мы не можем изменить код, который проверяет его)
То, что мы можем сделать, чтобы исправить это для цикла, в котором размер является фиксированным, - это оценить длину один раз в начале цикла и сохранить ее в переменной. Затем мы можем проверить переменную, чтобы решить, когда завершить цикл. Это намного быстрее, чем вычисление длины массива каждый раз, особенно когда массив содержит более нескольких записей или является частью веб-страницы.
Код для этого:
for (var i = 0, var j = myArray.length; i < j; i++) {...
Так что теперь мы только один раз оцениваем размер массива и проверяем наш счетчик цикла по переменной, которая каждый раз хранит это значение в цикле. Эта дополнительная переменная может быть доступна гораздо быстрее, чем оценка размера массива, поэтому наш код будет работать намного быстрее, чем раньше. У нас есть только одна дополнительная переменная в нашем скрипте.
Часто не имеет значения, в каком порядке мы обрабатываем массив, пока обрабатываются все записи в массиве. В этом случае мы можем немного ускорить наш код, покончив с добавленной нами дополнительной переменной и обработав массив в обратном порядке.
Последний код, который обрабатывает наш массив наиболее эффективным способом:
for (var i = myArray.length-1; i > -1; i--) {...
Этот код все еще оценивает размер массива только один раз в начале, но вместо сравнения счетчика цикла с переменной мы сравниваем его с константой. Поскольку доступ к константе еще более эффективен, чем к переменной, и поскольку у нас есть на один оператор присваивания меньше, чем раньше, наша третья версия кода теперь немного более эффективна, чем вторая, и значительно эффективнее первой.