Выше мы уже говорили, что в выражениях операторы выполняются в порядке, определяемом с помощью круглых скобок, согласно приоритетам; операторы с одинаковыми приоритетами выполняются слева направо. В этом разделе мы уточним приоритеты всех операторов. Круглые скобки, с помощью которых можно установить любой порядок выполнения операторов в выражении, можно считать операторами. Они обладают наивысшим приоритетом. Эти скобки могут образовывать структуру вложенности. Выражения, заключенные во внутренние круглые скобки, выполняются раньше тех, которые заключены во внешние круглые скобки. Интерпретатор JavaScript начинает анализ выражения именно с выяснения структуры вложенности пар круглых скобок. На втором месте по приоритету находится вычисление индексов массивов и определения самих элементов массивов. Индексы массивов, как известно, заключены в квадратные скобки. На последнем месте находится запятая, как разделитель параметров.
Распределение операторов по приоритетам
Приоритет Оператор Комментарий
1 ( ) от внутренних к внешним
function() вызов функции
2 ! логическое не
~ побитовое не
- отрицание
++ инкремент (приращение)
-- декремент
new
typeof
void
delete удаление объектного элемента
3 * умножение
/ деление
% деление по модулю (остаток от деления)
4 + сложение (конкатенация)
- вычитание
5 << побитовые сдвиги
>>
>>>
6 < меньше
<= не больше (меньше или равно)
> больше
>= не меньше (больше или равно)
7 == равенство
!= неравенство
8 & побитовое и
9 ^ побитовое исключающее или
10 | побитовое или (дизъюнкция)
11 && логическое и (конъюнкция)
12 || логическое или
13 ? условное выражение (оператор условия)
14 = операторы присваивания
+=
-=
*=
/=
%=
<<=
>=
>>=
&=
^=
|=
15 , запятая (разделитель параметров)
Кроме приоритетов следует также учитывать, что сложные логические выражения, состоящие из нескольких более простых, соединенных операторами И и ИЛИ, выполняются по так называемому принципу короткой обработки. Это означает, что значение всего выражения бывает можно определить, вычислив лишь одно или несколько более простых выражений, не вычисляя остальные. Например, выражение x&&y вычисляется слева направо; если значение x оказалось равным false, то значение y не вычисляется, поскольку и так известно, что значение всего выражения равно false. Аналогично, если в выражении x || y значение x равно true, то значение y не вычисляется, поскольку уже ясно, что все выражение равно true.