Выражения и операторы JavaScript | ассоциативность, приоритет

Любая комбинация переменных и операторов, которая может быть вычислена интерпретатором для получения значения, называется выражением. Первичные выражения являются самостоятельными выражениями - они не включают в себя ещё более простых выражений.

Выражения и операторы JavaScript | ассоциативность, приорите

» » Сообщение:

Выражения

Выражение - это любая единица исходного кода программы, которая может быть вычислена для получения значения. Выражения делятся простые (их также называют первичными), и сложные.
Первичные выражения являются самостоятельными выражениями - они не включают в себя ещё более простых выражений. К первичным выражениям относятся: ключевое слово this, идентификаторы, литералы и оператор группировки.
Сложные выражения состоят из простых выражений.
Типичный способ конструирования сложных выражений из простых выражений заключается в использовании операторов:

script Код: Выделить всё Развернуть
// Примеры первичных выражений
this                     // Значение зависит от контекста выполнения
11                       // Числовой литерал
str                      // Возвращает значение переменной
[]                       // Литерал массива
()                       // Оператора группировки
script Код: Выделить всё Развернуть
// Примеры сложных выражений
alpha + 19               // Возвращает результат арифметической операции
(alpha - 37) * beta / 2  // Возвращает результат арифметических операций
foo()                    // Возвращает результат вызова функции
mass[1]                  // Возвращает значение элемента массива

Операторы

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

Существует один оператор, у которого нет операндов - это оператор группировки.

Операторы могут автоматически преобразовывать типы своих операндов по мере необходимости.
Например, оператор умножения * ожидает получить числовые операнды, поэтому выражение "2" * "3" считается вполне допустимым благодаря тому, что интерпретатор выполнит неявное преобразование строковых операндов в числа.

Ассоциативность операторов

Ассоциативность оператора определяет порядок выполнения операций с одинаковым приоритетом.
Ассоциативность слева направо означает, что операции выполняются слева направо, ассоциативность справа налево - наоборот. Например, оператор вычитания имеет ассоциативность слева направо, поэтому следующие два выражения эквивалентны:

script Код: Выделить всё Развернуть
w = x - y - z;
w = (x - y) - z;

Оператор присваивания имеет ассоциативность справа налево, поэтому следующие два выражения в инструкциях также эквивалентны:

script Код: Выделить всё Развернуть
w = x = y = z;
w = (x = (y = z));

Приоритет операторов

Приоритет операторов управляет порядком, в котором выполняются операции.
Операторы с более высоким приоритетом выполняются раньше операторов с более низким приоритетом.

Операторы перечислены в таблице в порядке уменьшения приоритета, горизонтальные линии отделяют группы операторов с разным уровнем приоритета.

В колонке "Типы значений" указаны ожидаемые типы операндов (перед стрелкой) и тип результата возвращаемого оператором (после стрелки).
В колонке "О" указано количество операндов.

lval (сокращение от left value) - левостороннее выражение.
Это исторический термин, обозначающий - выражение, которое может присутствовать слева от оператора присваивания. Левосторонними выражениями являются: переменные, свойства объектов и элементы массивов.
Оператор Операция Ассоциатив. О Типы значений
(...) Оператор группировки отсутствует
0 любой
... . ...
... [...]
new ... (...)
Оператор доступа
Оператор доступа
Создание объекта
слева направо
слева направо
отсутствует
2
2
1
lval, lval → любой
lval, строка или число → любой
конструктор → объект
... (...) Оператор вызова функции слева направо 1 функция → любой
++
--
Префиксный и постфиксный инкремент
Префиксный и постфиксный декремент
отсутствует
отсутствует
1
1
lval → число
lval → число
+
-
!
~
delete
typeof
void
Унарный плюс
Унарный минус
Логическое НЕ (инверсия)
Поразрядная инверсия
Удаление свойства
Определяет тип данных операнда
Возврат неопределённого значения
справа налево
справа налево
справа налево
справа налево
справа налево
справа налево
справа налево
1
1
1
1
1
1
1
число → число
число → число
булево → булево
целое → целое
lval → булево
любое → строка
любое → undefined
*
/
%
Умножение
Деление
Деление по модулю
слева направо
слева направо
слева направо
2
2
2
число, число → число
число, число → число
число, число → число
+
-
+
Сложение
Вычитание
Конкатенация
слева направо
слева направо
слева направо
2
2
2
число, число → число
число, число → число
строка, строка → строка
<<
>>
>>>
Сдвиг битов влево
Сдвиг битов вправо с сохранением знака
Сдвиг битов вправо с заполнением нулями
слева направо
слева направо
слева направо
2
2
2
целое, целое → целое
целое, целое → целое
целое, целое → целое
<, <=, >, >=
<, <=, >, >=
in
instanceof
Сравнение числовых значений
Сравнение строковых значений
Проверка наличия свойства
Проверка на принадлежность к данному типу
слева направо
слева направо
слева направо
слева направо
2
2
2
2
число, число → булево
строка, строка → булево
строка, объект → булево
объект, функция → булево
==
!=
===
!==
Проверка равенства
Проверка неравенства
Проверка строгого равенства (идентичности)
Проверка неидентичности
слева направо
слева направо
слева направо
слева направо
2
2
2
2
любое, любое → булево
любое, любое → булево
любое, любое → булево
любое, любое → булево
& Поразрядное И слева направо 2 целое, целое → целое
^ Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ слева направо 2 целое, целое → целое
| Поразрядное ИЛИ слева направо 2 целое, целое → целое
&& Логическое И слева направо 2 любое, любое → любое
|| Логическое ИЛИ слева направо 2 любое, любое → любое
... ? ... : ... Выбор второго или третьего операнда справа налево 3 булево, любое, любое → любое
= Присваивание справа налево 2 lval, любое → любое
+=, -=, *=,
/=, %=, +=,
^=, |=, &=,
<<=, >>=,
>>>=
Операции с присваиванием справа налево 2 lval, любое → любое
... , ... Вычисляет оба операнда и возвращает значение второго слева направо 2 любое, любое → любое

Арифметические операторы

Оператор Операция Ассоциативность Операнды Типы значений
+
-
*
/
%
-
+
Сложение
Вычитание
Умножение
Деление
Деление по модулю (с остатком)
Унарный минус
Унарный плюс
слева направо
слева направо
слева направо
слева направо
слева направо
справа налево
справа налево
2
2
2
2
2
1
1
число, число → число
число, число → число
число, число → число
число, число → число
число, число → число
число → число
число → число

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

script Код: Выделить всё Развернуть
var num1 = 10;
var num2 = 2;
var num3 = 5
document.write(num1 + num2 + "<br>");
document.write(num1 - num2 + "<br>");
document.write(num1 * num2 + "<br>");
document.write(num1 / num2 + "<br>");
document.write(num3 % num2 + "<br>");
document.write(-num3 % num2);

Оператор унарный плюс (+) преобразует значение своего операнда в число и возвращает преобразованное значение. При использовании с числовым операндом он не выполняет никаких действий:

script Код: Выделить всё Развернуть
var x = "5";
alert(+x - 2);

Оператор унарный минус (-) преобразует значение своего операнда в число, если это необходимо, и затем изменяет знак возвращаемого значения - делает число отрицательным:

script Код: Выделить всё Развернуть
var x = "3";
alert(4 + (-x));
В данном случае круглые скобки не нужны вокруг "-x", но они помогают организовать код таким образом, чтобы было понятно, что имеет место сложение чисел -3 и 4.

Нечисловые операнды, которые не могут быть преобразованы в числа, преобразуются в значение NaN.
Если какой-либо из операндов имеет значение NaN, результатом операции также будет значение NaN.

script Код: Выделить всё Развернуть
var str = "1x";
var num = 5;
alert(num - str);
alert(++str);
alert(+str);

Инкремент и декремент

Оператор Операция Ассоциативность Операнды Типы значений
++
--
Префиксный и постфиксный инкремент
Префиксный и постфиксный декремент
не поддерживается
не поддерживается
1
1
lval → число
lval → число

Оператор инкремент (++) увеличивает значение своего операнда, на единицу.
Если операнд не является числом, оператор инкремента автоматически преобразует его в число, увеличивает на единицу и присваивает результат обратно операнду.
Если операнд невозможно преобразовать в число, оператор возвращает значение NaN.

Инкремент имеет две формы - постфиксную (после операнда - x++) и префиксную (перед операндом - ++x).
Значение, возвращаемое оператором ++, зависит от его положения по отношению к операнду.
Если он используется в постфиксной форме, то сначала возвращается исходное значение операнда, и только затем значение операнда увеличивается на единицу:

script Код: Выделить всё Развернуть
var x = 5;
alert(x++);
alert(x);

В отличие от постфиксной формы, инкремент в префиксной форме сразу увеличивает значение своего операнда на единицу:

script Код: Выделить всё Развернуть
var x = 5;
alert(++x);

Увеличить значение на единицу можно также и следующим образом:

php Код: Выделить всё Развернуть
var x = 1;
= x + 1;

Обратите внимание на следующий момент, выражение ++x не всегда возвращает тот же результат, что и выражение "x = x + 1" или "x += 1".
Оператор ++ никогда не выполняет операцию конкатенации: он всегда преобразует значение своего операнда в число и увеличивает его.
Если значение x является строкой "1", то выражение ++x вернёт число 2, тогда как выражение x + 1 или x += 1 вернёт строку "11":

script Код: Выделить всё Развернуть
var x = "1";
var y = "1";
x = x + 1;
++y;
document.write("x: " + x + "<br>");
document.write("y: " + y);

Оператор декремент (--) работает аналогично оператору ++, но не увеличивает значение своего операнда, а наоборот, уменьшает его на единицу:

script Код: Выделить всё Развернуть
var x = 5;
alert(--x);

Присваивание

Оператор Операция Ассоциативность Операнды Типы значений
=
+=, -=, *=, /=, %=
Присваивание
Операция с присваиванием
справа налево
справа налево
2
2
lval, любое → любое
lval, любое → любое

Для присваивания значения используется оператор присваивания.
Оператор присваивания обозначается символом = (равно).
Левым операндом оператора = должно быть левостороннее выражение.
Правым операндом может быть значение любого типа. Возвращаемым значением оператора присваивания является значение правого операнда.

script Код: Выделить всё Развернуть
var x = 20;
var y = x + 32;

Оператор присваивания имеет ассоциативность справа налево, поэтому при наличии в выражении нескольких операторов присваивания они вычисляются справа налево. Благодаря этому можно написать код, присваивающий одно значение нескольким переменным:

script Код: Выделить всё Развернуть
var a, d, f;
a = d = f = 101;

Значение присваивается справа налево, сначала переменной "f", затем значение переменной "f" присваивается переменной "d" и, наконец, значение переменной "d" присваивается переменной "a".
Такой способ присваивания "по цепочке" удобен для присваивания общего значения целой группе переменных.

Помимо обычного оператора присваивания (=) в JavaScript поддерживается несколько других операторов, объединяющих присваивание с другой операцией (их также называют составные или сокращённые операторы присваивания).
Следующее выражение:

script Код: Выделить всё Развернуть
a op= b

где op означает оператор, эквивалентно выражению:

script Код: Выделить всё Развернуть
a = a op b

Например, оператор += выполняет сложение и присваивание.
Следующее выражение:

script Код: Выделить всё Развернуть
x += 5;

Эквивалентно выражению:

script Код: Выделить всё Развернуть
x = x + 5;

Как и ожидается, оператор += работает и с числами, и со строками.
Для числовых операндов он выполняет сложение и присваивание, а для строковых - конкатенацию и присваивание.

Оператор группировки

Синтаксис оператора группировки:

script Код: Выделить всё Развернуть
(выражение)

Оператор группировки состоит из пары круглых скобок.
Он возвращает результат вычисления выражения, расположенного внутри скобок. Он может также возвращать значение, относящееся к ссылочному типу данных (т. е. может возвращать непосредственно ссылку), так например, следующее выражение, расположенное в операторе группировки, возвращает ссылку на функцию:

(function () {})

Оператор группировки часто используется для определения порядка выполнения операций в выражении:

script Код: Выделить всё Развернуть
w = x + y * z;
w = (x + y) * z;

Оператор typeof

Оператор Операция Ассоциативность Операнды Типы значений
typeof Определяет тип данных операнда справа налево 1 любое→строка

Оператор typeof располагается перед своим единственным операндом, который может иметь любой тип.
Его возвращаемым значением является строка, указывающая на тип данных операнда.
Следующая таблица содержит значения возвращаемые оператором typeof для всех типов значений, возможных в JavaScript.

Значение x typeof x
undefined
null
true или false
любое число, Infinity или NaN
любая строка
любая функция
любой объект или массив базового языка
"undefined"
"object"
"boolean"
"number"
"string"
"function"
"object"

Операнд оператора typeof может быть записан в двух формах:

script Код: Выделить всё Развернуть
var x = 5;
document.write(typeof x + "<br>");
document.write(typeof (x));

Форма записи операнда никак не влияет на результат: можно использовать скобки, а можно и не использовать - работает одинаково.

Оператор запятая

Оператор Операция Ассоциативность Операнды Типы значений
, Вычисляет оба операнда и возвращает значение второго слева направо 2 любое, любое → любое

Оператор запятая (,) является бинарным оператором и может принимать операнды любого типа.
Он вычисляет оба операнда (слева направо) и возвращает значение правого операнда:

script Код: Выделить всё Развернуть
var n = (5, 10);
document.write(n);    // =>10

var a, b, c
a = (b=1, c=4);
document.write(a);    // =>4
document.write(b);    // =>1
document.write(c);    // =>4

Оператор запятая позволяет создавать цепочки выражений. Каждое выражение в цепочке обрабатывается последовательно слева направо, в конце возвращается результат последнего выражения:

script Код: Выделить всё Развернуть
var n = (1, 2, 3, 4);
document.write(n); // =>4

Следующий пример эквивалентен примеру выше - он показывает порядок выполнения выражений:

script Код: Выделить всё Развернуть
var a = (((1, 2), 3), 4);
document.write(a); // =>4

Оператор запятая можно использовать в тех случаях, когда необходимо вставить несколько выражений там, где требуется одно выражение, например в цикле for:

script Код: Выделить всё Развернуть
for (var i=1, j=5; i <= 5; i++, j--)
  document.write(i + " " + j +"<br>");
унарный, оператор, бинарный, тернарный, ассоциативность, вычитание, сложение, умножение, деление, арифметические, инкремент, декремент, typeof



Похожие темыКомментарии ПросмотрыПоследнее сообщение
151431Re: Рейтинг материалов +/- (плюс/ми...
Сообщение от: kinouser
3900BBComplex - Классы для каскадных та...
Сообщение от: Admin
0463JavaScript методы alert, document.w...
Сообщение от: Admin
078Вывод страницы на печать, версия дл...
Сообщение от: likbezz
0560Замена прямых кавычек на “ёлочки”. ...
Сообщение от: Admin