Выражения и операторы JavaScript

В этой главе:

  • Выражения

  • Операторы

  • Описание колонок таблицы

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

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

  • Оператор typeof

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

Выражения

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Первичные выражения
this                 // Значение зависит от конекста выполнения
11                   // Числовой литерал
"строка"             // Строковой литерал
str                  // Возвращает значение переменной
[1, 2, 3]            // Литерал массива
{x: 2, y:2}          // Литерал объекта
(5 + 3)              // Выражение внутри оператора группировки
 
// Более сложные выражения
alpha + 19           // Возвращает результат арифметической операции
(alpha - 37)*beta/2  // Возвращает результат арифметических операций
foo()                // Возвращает результат вызова функции
mass[1]              // Возвращает значение элемента массива

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

1
(function () {})

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

1
2
w = x + y * z;
w = (x + y) * z;

Операторы

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

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

Описание колонок таблицы

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

1
2
w = x - y - z;
w = (x - y) - z;

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

1
2
w = x = y = z;
w = (x = (y = z));

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

lval (сокращение от left value) - левостороннее выражение. Это исторический термин, обозначающий - выражение, которое может присутствовать слева от оператора присваивания. Левосторонними выражениями являются: переменные, свойства объектов и элементы массивов.

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

Оператор

Операция

A

N

Типы значений

++

--

+

-

*

/

%

+

-

Префиксный и постфиксный инкремент

Префиксный и постфиксный декремент

Сложение

Вычитание

Умножение

Деление

Деление по модулю

Унарный плюс

Унарный минус

R

R

L

L

L

L

L

R

R

1

1

2

2

2

2

2

1

1

lval→число

lval→число

число, число→число

число, число→число

число, число→число

число, число→число

число, число→число

число→число

число→число

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

1
2
3
4
5
6
7
8
9
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);

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

1
2
3
var x = 5;
alert(x++);
alert(x);

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

1
2
var x = 5;
alert(++x);

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

1
2
var x = 1;
x = x + 1;

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

1
2
3
4
5
6
var x = "1";
var y = "1";
x = x + 1;
++y;
document.write("x: " + x + "<br>");
document.write("y: " + y);

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

1
2
var x = 5;
alert(--x);

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

1
2
var x = "5";
alert(+x - 2);

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

1
2
var x = "3";
alert(4 + (-x));

В данном случае круглые скобки не нужны вокруг "-x", но они помогают организовать код таким образом, чтобы было понятно, что имеет место сложение чисел -3 и 4.

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

1
2
3
4
5
var str = "1x";
var num = 5;
alert(num - str);
alert(++str);
alert(+str);

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

Оператор

Операция

A

N

Типы значений

=

+=, -=, *=, /=, %=

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

Операция с присваиванием

R

R

2

2

lval, любое→любое

lval, любое→любое

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

1
2
var x = 20;
var y = x + 32;

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

1
2
var a, d, f;
a = d = f = 101;

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

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

1
a op= b

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

1
a = a op b

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

1
x += 5;

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

1
x = x + 5;

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

Обратите внимание, что составные операторы присваивания записываются более кратко, чем их несоставные эквиваленты. Поэтому их ещё иногда называют сокращённые операторы присваивания.

Оператор typeof

Оператор

Операция

A

N

Типы значений

typeof

Определяет тип данных операнда

R

1

любое→строка

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

Значение x

typeof x

undefined

null

true или false

любое число, Infinity или NaN

любая строка

любая функция

любой объект или массив базового языка

"undefined"

"object"

"boolean"

"number"

"string"

"function"

"object"

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

1
2
3
var x = 5;
document.write(typeof x + "<br>");
document.write(typeof (x));

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

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

Оператор

Операция

A

N

Типы значений

,

Вычисляет оба операнда и возвращает значение второго

L

2

любое, любое→любое

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

1
2
3
4
5
6
7
8
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

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

1
2
var n = (1, 2, 3, 4);
document.write(n); // =>4

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

1
2
var a = (((1, 2), 3), 4);
document.write(a); // =>4

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

1

2

for (var i=1, j=5; i <= 5; i++, j--)
  document.write(i + " " + j +"<br>");