Статьи

Несколько вопросов по JavaScript

Друг просматривал в последний пост , и он два вопроса об этом фрагменте кода JavaScript:

var entityIndex = entities.length - 1;
for (; entityIndex != 0; entityIndex--) {
    entities[entityIndex].draw(ctx);
}

  • Почему я инициализирую entityIndexвне цикла?
  • Почему я сравниваю entityIndexс 0?

Инициализация снаружи

Ответ на первый вопрос на самом деле просто личная читабельность (ну, может быть, небольшой штрих «это заставит людей задуматься»).

Давайте немного углубимся в конструкцию. Объявление forцикла состоит из трех выражений. (Я не говорю for(in)здесь.)

Первое выражение является инициализатором; это выполняется только один раз. Это обычно что-то вроде var i = 0. Это выражение все еще подлежит подъему .

Второе выражение является условным. Это выполнено по крайней мере один раз.

Третье выражение изменяет состояние и выполняется один раз каждый раз, когда условие выполняется. (Здесь нет больших сюрпризов.)

В приведенном выше случае я инстинктивно чувствовал, что в одной строке слишком много текста, поэтому я переместил первое выражение за пределы for. Это действительно оказывает влияние на способ выполнения кода и (поскольку переменная поднимается) на самом деле немного ближе к тому, что действительно делает интерпретатор.

По сравнению с нулем

Я решил использовать entityIndex != 0не потому, что хотел сравнить с нулем, а потому, что хотел избежать затрат на entities.lengthповторную оценку . Поскольку второе выражение вычисляется снова и снова, мы не хотим делать там что-нибудь дорогое. Если бы у нас entitiesбыло много участников, то расчет lengthмог оказать существенное влияние.

Есть некоторый вопрос об относительной производительности > 0против != 0, однако результаты теста для этого, кажется, указывают, что это не имеет значения.

Заключительные мысли

  • О оптимизациях легко зацикливаться, но важно понимать, что многие микрооптимизации зависят от браузера. Так что тестируйте, тестируйте, тестируйте, прежде чем тратить на это время.
  • Я сделал одно изменение, потому что оно было более читабельным для меня . Это может быть не так для вас. Если так, не делай этого.

Рекомендации