Статьи

Как писать более быстрые выражения JavaScript

В JavaScript есть интересная функция оптимизации, которая не обязательно применяется в других языках. Рассмотрим следующий пример кода:


var x = 10;
var y = true;

if (x*x > 1000 || y) alert("true!");

Как и следовало ожидать, «true» выводится, потому что y истинно — даже если первое условие не выполняется.

Интерпретаторы JavaScript анализируют каждое условие по порядку. Если мы изменим x на 100, x * x будет больше 1000 и получит значение true. Но поскольку мы используем логическое ИЛИ (||), интерпретатору никогда не нужно анализировать y — выражение должно быть истинным, чтобы отображалось предупреждение.

Таким образом, мы можем оптимизировать выражения, чтобы обеспечить анализ тех, которые требуют наименьшей обработки, т. Е.

 
if (y || x*x > 1000) alert("true!");

Если y истинно, интерпретатору никогда не понадобится оценивать второе условие. Это может сэкономить значительное время, особенно если мы вызываем функцию, выполняем интенсивные вычисления или анализируем DOM.

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

Задания внутри условий

Джеймс Эдвардс недавно написал статью « Назначение внутри условия», где он обсуждал такой код, как…

 
if (summary = document.getElementById("post-summary")) {
	alert(summary.innerHTML);
}

summary Если элемент существует, условие оценивается как истинное, и появляется предупреждение. Если элемент не может быть найден, условие оценивается как ложное, и ни один из условных кодов не выполняется.

Это полезный метод, хотя, согласно комментариям, немногим разработчикам понравилась практика, потому что он делает JavaScript более трудным для чтения и отладки.

Однако есть еще одна проблема — при двух или более условиях ваше назначение может никогда не исполниться. Например:

 
if (x || y = functionY()) {
	alert(y);
}

Если x оценивается как true, интерпретатор никогда не назначает значение y, и предупреждение всегда выдает ошибку.

Мы можем исправить это, изменив условия так, чтобы y всегда оценивалось, например,

 
if (y = functionY() || x) …

Даже тогда это может вызвать путаницу, потому что не очевидно, что упорядочение этих условий является существенным. Разработчик, прочитавший верхнюю половину этой статьи, может даже попытаться оптимизировать код, предварительно оценив x!

Итак, если вы хотите использовать назначения внутри условий, продолжайте — но будьте абсолютно уверены, что это единственное условие, которое вам когда-либо понадобится!