В этой главе рассматриваются выражения и операции JavaScript, в том числе: операции присвоения, сравнения, арифметические, побитовые, логические строковые и специальные.
Глава состоит из разделов:
Выражения
Операции
1. Выражения
Выражение это правильный набор литералов, переменных, операторов и выражений, который вычисляется в одно значение; это значение может быть числом, строкой или логическим значением.
Концептуально есть выражения двух видов: присваивающие значение переменной и просто имеющие значение. Например, выражение x = 7 это выражение, в котором x получает значение 7. Это выражение вычисляется в 7. Такие выражения используют операции присвоения. С другой стороны, выражение 3 + 4 просто вычисляется в 7; оно не выполняет присвоения значения. Операции, используемые в таких выражениях, называются просто операциями.
В JavaScript имеются следующие типы выражений:
Арифметические: вычисляются в число, например, 3.14159
Строковые: вычисляются до строки символов, например, Fred или 234
Логические: вычисляются до true или false
Объекты: вычисляются до получения объекта
2. Операции
В этом разделе рассмотрены операции и содержится информация о приоритете выполнения операций.
В JavaScript имеются следующие типы операций:
Присвоения
Сравнения
Арифметические
Побитовые
Логические
Строковые
Специальные
В JavaScript имеются бинарные и унарные операции. Для выполнения бинарной операции необходимы два операнда: один до знака операции и один – после:
операнд1 операция операнд2
Например, 3+4 или x*y.
Для выполнения унарной операции необходим один операнд, до или после знака операции:
операция операнд
или
операнд операция
Например, x++ или ++x.
Кроме того, в JavaScript есть условная тернарная операция. Она требует наличия трёх операндов.
2.1. Операции присвоения
Операция присвоения присваивает левому операнду значение на базе правого операнда. Базовой операцией присвоения является знак равенства (=), который присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение y переменной x.
Другие операции присвоения являются сокращёнными формами записи стандартных операций, как показано в таблице.
Таблица 3.1 Операции Присвоения
Сокращённое обозначение
Значение
x += y
x = x + y
x -= y
x = x – y
x *= y
x = x * y
x /= y
x = x / y
x %= y
x = x % y
x <<= y
x = x << y
x >= y
x = x > y
x &= y
x = x & y
x ^= y
x = x ^ y
2.2. Операции сравнения
Операция сравнения сравнивает операнды и возвращает логическое значение на базе верности сравнения. Операндами могут быть числа, строки, логические значения и объекты. Строки сравниваются на базе стандартного лексикографического порядка с использованием значений Unicode. В таблице даны операции сравнения.
Таблица 3.2 Операции сравнения
Операция
Описание
Примеры, возвращающие true1
Равно (==)
Возвращает true, если операнды равны. Если операнды разных типов, JavaScript пытается конвертировать операнды до типа, пригодного для сравнения.
3 == var1
3 == var1
3 == '3'
Не равно (!=)
Возвращает true, если операнды не равны. Если операнды разных типов, JavaScript пытается конвертировать операнды до типа, пригодного для сравнения.
var1 != 4
var2 != 3
Строго равно (===)
Возвращает true, если операнды равны и одного типа.
3 === var1
Строго не равно (!==)
Возвращает true, если операнды не равны и/или не одного типа.
var1 !== «3
3 !== '3'
Больше (>)
Возвращает true, если левый операнд больше правого.
var2 > var1
Больше или равно (>=)
Возвращает true, если левый операнд больше правого или равен ему.
var2 >= var1
var1 >= 3
Меньше (<)
Возвращает true, если левый операнд меньше правого.
var1 < var2
Меньше или равно (<=)
Возвращает true, если левый операнд меньше правого или равен ему.
var1 <= var2
var2 <= 5
Эти примеры предполагают, что переменной var1 присвоено значение 3, а переменной var2 значение 4.
2.3. Арифметические операции
Арифметические операции принимают числовые значения (литералы или переменные) в качестве операндов и возвращают одиночное числовое значение. Стандартными арифметическими операциями являются сложение (+), вычитание (-), умножение (*) и деление (/). Эти операции работают так же, как и во многих других языках программирования, но операция / в JavaScript возвращает результат деления с плавающей точкой, а не округлённое частное, как в языках программирования C или Java. Например:
1/2 //возвращает 0.5 в JavaScript
1/2 //возвращает 0 в Java
Дополнительно JavaScript предоставляет арифметические операции, перечисленные в следующей таблице:
Таблица 3.3 Арифметические операции
Операция
Описание
Пример
% (Modulus)
Бинарная операция. Возвращает целочисленный остаток от деления двух операндов.
12 % 5 возвращает 2.
++ (Инкремент)
Унарная операция. Добавляет 1 к операнду. Если используется как префикс (x), добавляет единицу и возвращает значение операнда; если используется как постфикс (x), возвращает значение операнда и затем прибавляет единицу.
Если x равен 3, то ++x устанавливает x в 4 и возвращает 4; а x++ устанавливает x в 4 и возвращает 3.
-- (Декремент)
Унарная операция. Вычитает единицу из операнда. Возвращаемое значение аналогично значению для операции инкремента.
Если x равен 3, то --x устанавливает x в 2 и возвращает 2; а x-- устанавливает x в 2 и возвращает 3.
- (Унарное отрицание)
Унарная операция. Возвращает операнд с изменённым знаком.
Если x равен -3, то -x возвращает 3.
2.4. Побитовые операции
Эти операции рассматривают свои операнды как набор 32-битных двоичных чисел (нулей и единиц), а не как 10-ричные, 16-ричные или 8-ричные числа. Например, 10-ричное число 9 имеет бинарное представление 1001. Побитовые операции выполняются над такими двоичными представлениями, но возвращают стандартные числовые значения JavaScript.
В таблице резюмируется информация о побитовых операциях JavaScript.
Таблица 3.4 Побитовые операции
Операция
Использование
Описание
Побитовое И
a & b
Возвращает 1 в каждой битовой позиции, где соответствующие биты обоих операндов равны 1.
Побитовое ИЛИ
a | b
Возвращает 1 в каждой битовой позиции, где соответствующие биты одного или обоих операндов равны 1.
Побитовое исключающее ИЛИ
a ^ b
Возвращает 1 в каждой битовой позиции, где соответствующие биты одного но не обоих операндов равны 1.
Побитовое НЕ
~ a
Инвертирует биты операнда.
Сдвиг влево
a << b
Сдвигает двоичное представление a на b битов влево, заполняя справа нулями.
Сдвиг вправо с сохранением знака
a >> b
Сдвигает двоичное представление a на b битов вправо, отбрасывая смещённые биты.
Сдвиг вправо с заполнением нулями
a >>> b
Сдвигает двоичное представление a на b битов вправо, отбрасывая смещённые биты и заполняя нулями слева.
2.4.1. Побитовые логические операции
Концептуально побитовые логические операции работают так:
Операнды конвертируются до 32-битных целых и выражаются серией битов (нулей и единиц).
Каждому биту первого операнда соответствует парный бит второго операнда: первый бит – первому, второй – второму, и так далее.
Операция выполняется для каждой пары битов, а результат конструируется побитно.
Например, бинарное представление 9 это 1001, а бинарное представление 15 это 1111. Итак, если побитовая операция применяется к этим двум числам, результаты будут такими:
15 & 9 даёт 9 (1111 & 1001 = 1001)
15 | 9 даёт 15 (1111 | 1001 = 1111)
15 ^ 9 даёт 6 (1111 ^ 1001 = 0110)
2.4.2. Побитовые операции сдвига
Побитовые операции сдвига принимают два операнда: первый операнд это сдвигаемое количество, а второй специфицирует количество битовых позиций, на которое сдвигается первый операнд. Направление сдвига контролируется применяемой операцией.
Операции сдвига конвертируют свои операнды в 32-битные целые и возвращают результат того же типа, что и у левого операнда.
Операции сдвига перечислены в таблице.
Таблица 3.5 Побитовые операции сдвига
Операция
Описание
Пример
<< (Сдвиг влево)
Эта операция сдвигает первый операнд на специфицированное количество битов влево. Излишние биты, смещённые влево, отбрасываются. Справа биты заполняются нулями.
9<<2 даёт 36, поскольку 1001, смещённое на 2 бита влево, становится 100100, то есть 36.
>> (Сдвиг вправо с сохранением знака)
Первый операнд сдвигается на специфицированное количество битов вправо. Излишние биты, смещённые вправо, отбрасываются. Копии самого левого бита вдвигаются слева.
9>>2 даёт 2, поскольку 1001, смещённое на 2 бита вправо, становится 10, то есть 2. Аналогично, -9>>2 даёт -3, поскольку знак сохраняется.
>>> (Сдвиг вправо с заполнением нулями)
Первый операнд сдвигается на специфицированное количество битов вправо. Излишние биты, смещённые вправо, отбрасываются. Слева биты заполняются нулями.
19>>>2 даёт 4, поскольку 10011, смещённое на 2 бита вправо, становится 100, то есть 4. Для неотрицательных чисел, сдвиг вправо с заполнением нулями даёт тот же эффект, что и сдвиг вправо с сохранением знака.
2.5. Логические операции
Логические операции обычно используются с Boolean (булевыми/логическими) значениями; в этом случае возвращается Boolean-значение. Однако операции && и || реально возвращают значение одного из специфицированных операндов, поэтому, если эти операции используются с не-Boolean-значениями, они могут вернуть не-Boolean значение. Логические операции описаны в следующей таблице.
Таблица 3.6 Логические операции
Операции
Использование
Описание
&&
expr1 && expr2
(Логическое И) Возвращает expr1, если оно может быть конвертировано в false; иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, && возвращает true, если оба операнда true; иначе возвращает false.
||
expr1 || expr2
(Логическое ИЛИ) Возвращает expr1, если оно может быть конвертировано в true; иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, || возвращает true, если хотя бы один из операндов true; если оба операнда false, возвращает false.
!
!expr
(Логическое НЕ) Возвращает false если её единственный операнд может быть конвертирован в true; иначе возвращает true.
Примерами выражений, которые могут быть конвертированы в false являются такие выражения, которые вычисляются в null, 0, пустую строку или undefined.
Вот примеры операции && (логическое И):
a1=true && true // t && t возвращает true
a2=true && false // t && f возвращает false
a3=false && true // f && t возвращает false
a4=false && (3 == 4) // f && f возвращает false
a5="Cat" && "Dog" // t && t возвращает Dog
a6=false && "Cat" // f && t возвращает false
a7="Cat" && false // t && f возвращает false
Примеры операции || (логическое ИЛИ):
o1=true || true // t || t возвращает true##
o2=false || true // f || t возвращает true##
o3=true || false // t || f возвращает true##
o4=false || (3 == 4) // f || f возвращает false##
o5="Cat" || "Dog" // t || t возвращает Cat##
o6=false || "Cat" // f || t возвращает Cat##
o7="Cat" || false // t || f возвращает Cat##
Так как логические выражения вычисляются слева направо, они проверяются на возможность выполнения «сокращённого» вычисления по следующим правилам:
false&& что-либо сокращённо вычисляется в false.
true|| что-либо сокращённо вычисляется в true.
Правила логики гарантируют, что эти вычисления всегда будут корректными. Обратите внимание, что часть что-либо вышеприведённых выражений не вычисляется, поэтому продолжение выполнения вычисления не даст никакого эффекта.
2.6. Строковые операции
Помимо операций сравнения, может применяться операция конкатенации/объединения (+) значений двух строк, возвращающее новую строку, которая является результатом объединения двух строк-операндов. Например, my " + string возвращает строку my string.
Сокращённая форма записи операции += также может использоваться для конкатенации строк. Например, если переменная mystring имеет значение alpha, то выражение mystring += bet вычисляется до alphabet и это значение присваивается переменной mystring.
2.7. Специальные операции
В JavaScript имеются следующие специальные операции:
Условная Операция
Операция «запятая»
delete
in
instanceof
new
this
typeof
void
2.7.1. Условная операция
Условная операция – единственная в JavaScript, принимающая три операнда. Она может дать одно или другое значение на базе условия. Синтаксис таков:
condition ? val1 : val2
Если condition – true, операция имеет значение val1. Иначе – значение val2. Вы можете использовать условную операцию в любом месте, где может использоваться стандартная операция.
Например,
status = (age >= 18) ? "adult" : "minor"
Этот оператор присваивает значение adult переменной status, если age равен 19 или более. Иначе переменной status присваивается значение minor.
2.7.2. Операция «запятая»
Операция «запятая» (,) просто вычисляет оба операнда и возвращает значение второго операнда. Первоначально использовалась внутри цикла for, чтобы дать возможность обновлять значения нескольких переменных за один проход цикла.
Например, если имеется 2-мерный массив из 10 элементов по измерению, следующий код использует операцию «запятая» для инкремента двух переменных за один проход. Печатаются значения элементов по диагонали массива:
for (var i=0, j=9; i <= 9; i++, j--)
document.writeln("a["+i+","+j+"]= " + a[i*10 +j])
Заметьте, что двухмерные массивы ещё не поддерживаются. Этот пример эмулирует двухмерный массив, используя одномерный массив.
2.7.3. delete
Операция delete удаляет объект, свойство объекта или элемент массива по специфицированному индексу. Синтаксис таков:
delete objectName
delete objectName.property
delete objectName[index]
delete property // верно только внутри оператора with
где objectName это имя объекта, property это существующее свойство, а index это целое число – место элемента в массиве.
Четвёртая форма верна только внутри оператора with при удалении свойства объекта.
Можно использовать операцию delete для удаления переменных, объявленных неявно, но не переменных, объявленных оператором var.
Если операция delete выполнена успешно, она устанавливает свойство или элемент в undefined. Операция delete возвращает true, если операция возможна, и false – если операция невозможна.
x=42
var y= 43
myobj=new Number()
myobj.h=4 // создаёт свойство h
delete x // возвращает true (может удалить, если х объявлена неявно)
delete y // возвращает false (не может удалить, если у объявлена через var)
delete Math.PI // возвращает false (не может удалить предопределённое свойство)
delete myobj.h // возвращает true (может удалить свойство, определённое пользователем)
delete myobj // возвращает true (может удалить, если myobj объявлен неявно)
Удаление элемента массива
Если Вы удаляете элемент массива, размер массива не изменяется. Например, если удалить a[3], a[4] всё ещё остаётся a[4], а a[3] станет undefined.
Если операция delete удаляет элемент массива, этот элемент больше не присутствует в массиве. В следующем примере trees[3] удаляется с помощью delete.
trees=new Array("redwood","bay","cedar","oak","maple")
delete trees[3]
if (3 in trees) {
// это не будет выполняться
}
Если Вы хотите, чтобы элемент массива существовал, но имел значение undefined/неопределённое, используйте ключевое слово undefined вместо операции delete. В следующем примере элементу trees[3] присваивается значение undefined, но элемент массива продолжает существовать:
trees=new Array("redwood","bay","cedar","oak","maple")
trees[3]=undefined
if (3 in trees) {
// это будет выполняться
}
2.7.4. in
Операция in возвращает true, если специфицированное свойство имеется в специфицированном объекте. Синтаксис таков:
propNameOrNumber in objectName
где propNameOrNumber это строка или числовое выражение, представляющее имя свойства или индекс массива, а objectName это имя объекта.
Некоторые примеры использования операции in:
// Массивы
trees=new Array("redwood","bay","cedar","oak","maple")
0 in trees // возвращает true
3 in trees // возвращает true
6 in trees // возвращает false
"bay" in trees // возвращает false (Вы обязаны специфицировать число индекса,
// а не значение, находящееся по этому индексу)
"length" in trees // возвращает true (length это Array-свойство)
// Предопределённые объекты
"PI" in Math // возвращает true
myString=new String("coral")
"length" in myString // возвращает true
// Специальные объекты
mycar = {make:"Honda",model:"Accord",year:1998}
"make" in mycar // возвращает true
"model" in mycar // возвращает true
2.7.5. instanceof
Операция instanceof возвращает true, если специфицированный объект имеет специфицированный тип объекта. Синтаксис:
objectName instanceof objectType
где objectName это имя объекта, сравниваемого с objectType, а objectType это тип объекта, такой как Date или Array.
Используйте instanceof, если Вам нужно подтвердить тип объекта на этапе прогона. Например, при отлове исключений Вы можете выполнить ветвление по разным вариантам кода обработки исключений, в зависимости от типа вызываемого исключения.
Например, следующий код использует instanceof для определения того, является ли theDayDate-объектом. Поскольку theDay это Date-объект, операторы в операторе if выполняются.
Вы можете использовать операцию new для создания экземпляра объекта пользовательского типа или экземпляра одного из предопределённых типов объекта: Array, Boolean, Date, Function, Image, Number, Object, Option, RegExp или String. На сервере Вы можете также использовать её с DbPool, Lock, File или SendMail. Используйте new так:
objectName = new objectType ( param1 [,param2] ...[,paramN] )
Вы можете также создать объекты, используя инициализаторы объектов, как описано в «Использовании Инициализаторов Объектов».
См. new в книге ЯдроJavaScript. Справочник.
2.7.7. this
Ключевое слово this предназначено для обращения к текущему объекту. В общем, this ссылается на вызывающий объект в методе. Используйте this так:
this[.propertyName]
Пример 1.
Предположим, функция validate проверяет значение свойства объекта и верхнее и нижнее значение:
function validate(obj, lowval, hival) {
if ((obj.value < lowval) || (obj.value > hival))
alert("Invalid Value!")
}
Вы можете вызывать validate в обработчике события onChange в каждом элементе формы, используя this для передачи ему элемента формы, как в этом примере:
<B>Enter a number between 18 and 99:</B>
<INPUT TYPE = "text" NAME = "age" SIZE = 3
onChange="validate(this, 18, 99)">
Пример 2.
При соединении со свойством формы, this может ссылаться на родительскую форму текущего объекта. В следующем примере форма myForm содержит Text-объект и кнопку. Если пользователь щёлкает на кнопке, значением Text-объекта становится имя формы. Обработчик onClick кнопки использует this.form для обращения к родительской форме myForm.
<FORM NAME="myForm">
Form name:<INPUT TYPE="text"NAME="text1"VALUE="Beluga">
<P>
<INPUT NAME="button1"TYPE="button"VALUE="Show Form Name"onClick="this.form.text1.value=this.form.name">
</FORM>
2.7.8. typeof
Операция typeof используется одним из следующих способов:
1. typeof operand
2. typeof (operand)
Операция typeof возвращает строку, указывающую тип невычисленного операнда.
operand это строка, переменная, ключевое слово или объект, тип которого возвращается. Скобки не обязательны.
Предположим, Вы определяете следующие переменные:
var myFun = new Function("5+2")
var shape="round"
var size=1
var today=new Date()
Операция typeof возвращает для этих переменных следующие результаты:
typeof myFun is function
typeof shape is string
typeof size is number
typeof today is object
typeof dontExist is undefined
Для ключевых слов true и null операция typeof возвращает следующие результаты:
typeof true is boolean
typeof null is object
Для числа или строки операция typeof возвращает следующие результаты:
typeof 62 is number
typeof 'Hello world' is string
Для значений свойств операция typeof возвращает тип значения, содержащегося в свойстве:
typeof document.lastModified is string
typeof window.length is number
typeof Math.LN2 is number
Для методов и функций операция typeof возвращает следующие результаты:
typeof blur is function
typeof eval is function
typeof parseInt is function
typeof shape.split is function
Для предопределённых объектов операция typeof возвращает такие результаты:
typeof Date is function
typeof Function is function
typeof Math is function
typeof Option is function
typeof String is function
2.7.9. void
Операция void используется одним из следующих способов:
1. void (expression)
2. void expression
Операция void специфицирует выражение, вычисляемое без возвращения значения.
expression это вычисляемое выражение JavaScript. Скобки вокруг выражения не обязательны, но хорошим стилем является их использование.
Можно использовать оператор void для специфицирования выражения как гипертекстовой ссылки. Выражение вычисляется, но не загружается вместо текущего документа.
Следующий код создаёт гипертекстовую ссылку, которая ничего не делает, если пользователь щёлкает на ней. Если пользователь щёлкает на ссылке, void(0) вычисляется в undefined, что не вызывает никаких действий в JavaScript.
<A HREF="javascript:void(0)">Click here to do nothing</A>
Следующий код создаёт гиперссылку, которая отправляет форму, если пользователь щёлкает на ссылке.
<A HREF="javascript:void(document.form.submit())">
Click here to submit</A>
2.8. Приоритет операций
Приоритет операций определяет порядок выполнения операций при вычислении выражения. Вы можете переопределить порядок выполнения путём использования скобок.
В таблице описан приоритет операций от низшего к высшему.