Глава 3.4. Выражения и операции

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

Существует два типа выражений: те, которые присваивают значение некоторой переменной (например, x = 2 + 3), и те, которые просто имеют некое значение (например, 2 + 3). Первый тип выражений называется операциями присваивания.

Все операции в JavaScript подразделяются на следующие:

3.4.1. Операции сравнения

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

  • Операции "больше", "меньше", "не больше" и "не меньше" сначала пытаются преобразовать операнды в числа, а, если это невозможно, то в строки, а затем производят их сравнение.
  • Операции "равно" и "не равно" пытаются преобразовать операнды в строки, затем в числа и в логические значения, а затем производят их сравнение.
  • Операции "тождественно" и "не тождественно" не преобразовывают типы данных: два операнда считаются тождественно равными, если они имеют одинаковые типы и одинаковые значения.
Таблица 3.1. Операции сравнения
Операция Название Описание
a < b Меньше Возвращает true, если левый операнд меньше, чем правый операнд.
a > b Больше Возвращает true, если левый операнд больше, чем правый операнд.
a <= b Не больше Возвращает true, если левый операнд меньше или равен правому операнду.
a => b Не меньше Возвращает true, если левый операнд больше или равен правому операнду.
a == b Равно Возвращает true, если левый операнд равен правому операнду.
a != b Не равно Возвращает true, если левый операнд не равен правому операнду.
a === b Тождественно Возвращает true, если левый операнд тождественно равен правому операнду.
a !== b Не тождественно Возвращает true, если левый операнд тождественно не равен правому операнду.

Примеры:

var x = "3";
a = x == 3;	// a равно true
b = x === 3;	// b равно false (разные типы)

3.4.2. Арифметические операции

Арифметические операции применяются к числовым операндам и возвращают числовое значение, означающее результат операции. Если типы операндов различны, то делается попытка преобразовать их к числовому типу. При этом:

  • Операция "сложение" выполняется только тогда, когда оба операнда являются числами или логическими значениями. Если хотя бы один операнд является строкой, то производится конкатенация строк.
  • Остальные операции преобразуют операнды в числа, а затем выполняют операцию.
  • Операции "инкремент" и "декремент" применяются только к переменным.
Таблица 3.2. Арифметические операции
Операция Название Описание
a + b Сложение Возвращает сумму двух операндов.
a - b Вычитание Возвращает разность от вычитания правого операнда из левого.
a * b Умножение Возвращает произведение двух операндов.
a / b Деление Возвращает частное от деления левого операнда на правый.
a % b Остаток по модулю Возвращает целый остаток от деления левого операнда на правый. Плавающие числа перед операцией округляются до целых.
++ Инкремент Унарная операция. Увеличивает значение переменной на 1. Если используется как префикс (++a), возвращает значение операнда после увеличения его на 1. Если используется как постфикс (a++), возвращает значение операнда перед увеличением его на 1.
-- Декремент Унарная операция. Уменьшает значение переменной на 1. Если используется как префикс (--a), возвращает значение операнда после уменьшения его на 1. Если используется как постфикс (a--), возвращает значение операнда перед уменьшением его на 1.
-a Смена знака Унарная операция. Возвращает арифметическое отрицание операнда.

Примеры:

var i, j, k;
i = 19 % 6.8;	// i равно 5
k = 2;
j = k++;	// j равно 2, k равно 3
j = ++k;	// j и k равны 4

3.4.3. Битовые операции

Битовые операции применяются к числовым операндам, представленным как двоичные числа (т. е. как цепочки из 32 битов), и возвращают числовое значение, означающее результат операции. Перед выполнением операции операнды преобразуются в целые числа, а результат операции преобразуется в Number.

WDH+ О проблемах, связанных с этими преобразованиями см. WDH+: Последний бит.

Таблица 3.3. Битовые операции
Операция Название Описание
a & b Побитовое AND Возвращает в каждой битовой позиции 1, если соответствующие позиции обоих операндов равны 1.
a | b Побитовое OR Возвращает в каждой битовой позиции 1, если соответствующая позиция хотя бы одного операнда равна 1.
a ^ b Побитовое XOR Возвращает в каждой битовой позиции 1, если соответствующая позиция ровно одного операнда равна 1.
~a Побитовое NOT Унарная операция. Инвертирует каждую битовую позицию операнда.
a << b Сдвиг влево Сдвигает двоичное представление левого операнда влево на количество бит, заданное вторым операндом. Освобождающиеся справа биты заполняются нулями.
a >> b Арифметический сдвиг вправо Сдвигает двоичное представление левого операнда вправо на количество бит, заданное вторым операндом. Освобождающиеся слева биты заполняются старшим (знаковым) битом.
a >>> b Логический сдвиг вправо Сдвигает двоичное представление левого операнда вправо на количество бит, заданное вторым операндом. Освобождающиеся слева биты заполняются нулями.

Примеры:

var i, j, k;
i = 15; j = 9;
k = i & j;	// k равно 9 (1111 & 1001 = 1001)
k = i | j;	// k равно 15 (1111 | 1001 = 1111)
k = i ^ j;	// k равно 6 (1111 ^ 1001 = 0110)
i = -14;	// двоичное значение 11111111 11111111 11111111 11110010
j = i >> 2;	// j равно -4 (11111111 11111111 11111111 11111100)
k = i >>> 2;	// k равно 1073741820 (00111111 11111111 11111111 11111100)

3.4.4. Логические операции

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

Таблица 3.4. Логические операции
Операция Название Описание
a && b Логическое AND Возвращает true, если оба операнда истинны. Если первый операнд ложен, то возвращает false, не вычисляя значение второго операнда.
a || b Логическое OR Возвращает true, если хотя бы один операнд истинен. Если первый операнд истинен, то возвращает true, не вычисляя значение второго операнда.
!a Логическое NOT Унарная операция. Возвращает true, если операнд ложен.

Примеры:

var i, j, k;
i = 3; j = 5;
k = (i < 4) && (j > 4);	// k равно true
k = (i < 4) || (j > 5);	// k равно true
k = !k;			// k равно false

3.4.5. Строковые операции

На сегодняшний день JavaScript поддерживает единственную строковую операцию, а именно конкатенацию строк, которая обозначается символом "+". Если хотя бы один операнд является строкой, то результатом операции является слияние строк-операндов. Примеры:

k = "Моя " + "строка";		// k равно "Моя строка"
text = "Результат: " + 123;	// text равно "Результат: 123"

3.4.6. Операции присваивания

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

Таблица 3.5. Операции присваивания
Операция Значение
a += b a = a + b
a -= b a = a - b
a *= b a = a * b
a /= b a = a / b
a %= b a = a % b
a <<= b a = a << b
a >>= b a = a >> b
a >>>= b a = a >>> b
a &= b a = a & b
a |= b a = a | b
a ^= b a = a ^ b

Операция присваивания возвращает значение, которое равно значению, присвоенному левому операнду. Пример:

i = j = k = 0;	// все переменные получают значение 0

3.4.7. Прочие операции

3.4.7.1. Условная операция

Условная операция — это единственная тернарная операция в JavaScript. Она имеет вид:

test ? value1 : value2

где test — любое логическое выражение, а value1 и value2 — любые выражения. Если test истинно, то операция возвращает значение value1, в противном случае она возвращает значение value2. Пример:

var status = (age >= 18) ? "взрослый" : "подросток";

3.4.7.2. Операция запятая

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

expr1,expr2

где expr1 и expr2 — любые выражения. Основное применение эта операция находит в операторе цикла for, поскольку последний допускает только одно выражение, которое исполняется в конце каждого цикла. Операция запятая позволяет объединить два выражения в одно и, тем самым, обойти это ограничение. Пример:

for (i = 0; i < 10; i++, j++) {
  k = i + j;
}

3.4.7.3. Операция delete

Операция delete удаляет свойство объекта или элемент массива. Она имеет вид:

delete expr

где expr — любое выражение, значением которого является свойство объекта или элемент массива. Если удаление прошло успешно, то операция возвращает значение true; если нет (например, если свойство объекта не может быть удалено), то она возвращает значение false.

Эта операция может также применяться для удаления неявно декларированных переменных (т. е. тех, декларация которых не содержит ключевого слова var).

При удалении элемента массива длина массива и нумерация его элементов не изменяются, но удаленный элемент становится неопределенным.

Примеры:

mynumber = new Number();	// создает новый объект
mynumber.high = 100;		// создает новое свойство объекта
delete mynumber.high;		// удаляет свойство объекта
delete mynumber;		// удаляет объект
langs = new Array("HTML", "CSS", "JavaScript", "Java");
delete langs[2];		// удаляет элемент массива

3.4.7.4. Операция in

Операция in возвращает true, если левый операнд является свойством правого операнда. Она имеет вид:

property in object

где property — строковое выражение, значением которого является имя свойства, или числовое выражение, задающее номер элемента массива, а object — любое объектное выражение. Примеры:

mynumber = new Number();	// новый объект
mynumber.high = 100;		// новое свойство объекта
"high" in mynumber		// возвращает true
langs = new Array("HTML", "CSS", "JavaScript", "Java");
0 in langs			// возвращает true
4 in langs			// возвращает false

3.4.7.5. Операция instanceof

Операция instanceof возвращает true, если данный объект относится к данному классу объектов. Она имеет вид:

object instanceof type

где object — любое объектное выражение, а type — имя класса объектов. Примеры:

myDay = new Date(1958,5,21);	// новый объект
myDay instanceof Date		// возвращает true

3.4.7.6. Операция new

Операция new создает новый объект путем вызова конструктора объектов. Она имеет вид:

new type(arguments)

где type — имя конструктора, а arguments — список параметров, разделенных запятыми, используемых для инициализации объекта. Если список параметров пуст, то круглые скобки можно опустить. Примеры:

myObject = new Object;
myArray = new Array();
myDate = new Date("May 21 1958");
myDay = new Date(1958,5,21);

Подробнее о создании новых объектов см. п. 3.7.1.3.

3.4.7.7. Операция this

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

this.property

где property — имя свойства объекта.

Эта операция широко применяется в обработчиках событий HTML для указания на объект, вызвавший данное событие. Например, следующий фрагмент HTML-документа содержит поле ввода возраста и сценарий, проверяющий допустимость введенного значения.

<SCRIPT type="text/javascript">
function validate(obj, low, high) {
  if ((obj.value < low) || (obj.value > high))
    alert("Недопустимое значение!")
}
</SCRIPT>
<INPUT type="text" name="age" size="3" onchange="validate(this, 18, 99)">

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

3.4.7.8. Операция typeof

Операция typeof возвращает строку, содержащую информацию о типе операнда. Она имеет вид:

typeof expr или typeof(expr)

где expr — любое выражение. Возвращаемое значение может быть одной из шести строк: "number" (число), "string" (строка), "boolean" (логическое значение), "object" (объект), "function" (функция) или "undefined" (неопределенное значение). Примеры:

var size = 1;
var shape = "круглый";
var today = new Date();
typeof(size);	// возвращает "number"
typeof shape;	// возвращает "string"
typeof today;	// возвращает "object"

Примечание. В Microsoft JScript операция typeof может возвращать еще два значения: "date" (тип VT_DATE стандарта COM) и "unknown" (COM-интерфейсы ActiveX).

3.4.7.9. Операция void

Операция void вычисляет значение выражения и возвращает undefined. Она имеет вид:

void expr или void(expr)

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

3.4.8. Порядок выполнения операций

При вычислении выражений JavaScript учитывает приоритет операций: операции, имеющие больший приоритет, выполняются первыми. Если операции имеют равный приоритет, то они выполняются слева направо. Для изменения порядка выполнения операций следует пользоваться круглыми скобками: выражение, заключенное в них, имеет наивысший приоритет. В следующей таблице приведен список всех операций языка JavaScript в порядке убывания их приоритетов; операции, расположенные в одной строке таблицы, имеют равный приоритет.

Таблица 3.6. Приоритеты операций
Операция
. [] ()
++ -- - ~ ! delete new typeof void
* / %
+ -
<< >> >>>
< <= > >= instanceof
== != === !==
&
^
|
&&
||
?:
= += -= *= /= %= <<= >>= >>>= &= ^= |=
,