Wiki-учебник по веб-технологиям: JavaScript/ВыраженияИОперации ...

Главная | |

Выражения и операции


Оглавление документа

В этой главе рассматриваются выражения и операции JavaScript, в том числе: операции присвоения, сравнения, арифметические, побитовые, логические строковые и специальные.

Глава состоит из разделов:


1. Выражения


Выражение это правильный набор литералов, переменных, операторов и выражений, который вычисляется в одно значение; это значение может быть числом, строкой или логическим значением.

Концептуально есть выражения двух видов: присваивающие значение переменной и просто имеющие значение. Например, выражение x = 7 это выражение, в котором x получает значение 7. Это выражение вычисляется в 7. Такие выражения используют операции присвоения. С другой стороны, выражение 3 + 4 просто вычисляется в 7; оно не выполняет присвоения значения. Операции, используемые в таких выражениях, называются просто операциями.

В JavaScript имеются следующие типы выражений:





2. Операции


В этом разделе рассмотрены операции и содержится информация о приоритете выполнения операций.
В JavaScript имеются следующие типы операций:








В JavaScript имеются бинарные и унарные операции. Для выполнения бинарной операции необходимы два операнда: один до знака операции и один – после:

операнд1 операция операнд2

Например, 3+4 или x*y.

Для выполнения унарной операции необходим один операнд, до или после знака операции:

операция операнд

или

операнд операция

Например, x++ или ++x.

Кроме того, в JavaScript есть условная тернарная операция. Она требует наличия трёх операндов.

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


Операция присвоения присваивает левому операнду значение на базе правого операнда. Базовой операцией присвоения является знак равенства (=), который присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение y переменной x.

Другие операции присвоения являются сокращёнными формами записи стандартных операций, как показано в таблице.

Таблица 3.1 Операции Присвоения

Сокращённое обозначениеЗначение
x += yx = x + y
x -= yx = x – y
x *= yx = x * y
x /= yx = x / y
x %= yx = x % y
x <<= y
x = x << y
x >= yx = x > y
x &= yx = x & y
x ^= yx = 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. Побитовые логические операции


Концептуально побитовые логические операции работают так:




Например, бинарное представление 9 это 1001, а бинарное представление 15 это 1111. Итак, если побитовая операция применяется к этим двум числам, результаты будут такими:




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##


Примеры операции ! (логическое НЕ):
n1=!true              // !t возвращает false##
n2=!false             // !f возвращает true##
n3=!"Cat"             // !t возвращает false##


2.5.1. Сокращённое вычисление


Так как логические выражения вычисляются слева направо, они проверяются на возможность выполнения «сокращённого» вычисления по следующим правилам:


Правила логики гарантируют, что эти вычисления всегда будут корректными. Обратите внимание, что часть что-либо вышеприведённых выражений не вычисляется, поэтому продолжение выполнения вычисления не даст никакого эффекта.

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


Помимо операций сравнения, может применяться операция конкатенации/объединения (+) значений двух строк, возвращающее новую строку, которая является результатом объединения двух строк-операндов. Например, “my " + “ string” возвращает строку “my string”.

Сокращённая форма записи операции += также может использоваться для конкатенации строк. Например, если переменная mystring имеет значение “alpha”, то выражение mystring += “bet” вычисляется до “alphabet” и это значение присваивается переменной mystring.

2.7. Специальные операции


В JavaScript имеются следующие специальные операции:










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


Условная операция – единственная в JavaScript, принимающая три операнда. Она может дать одно или другое значение на базе условия. Синтаксис таков:

condition ? val1 : val2


Если conditiontrue, операция имеет значение 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 для определения того, является ли theDay Date-объектом. Поскольку theDay это Date-объект, операторы в операторе if выполняются.

theDay=new Date(1995, 12, 17)
if (theDay instanceof Date) {
   // выполняемые операторы
}


2.7.6. new


Вы можете использовать операцию 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. Приоритет операций


Приоритет операций определяет порядок выполнения операций при вычислении выражения. Вы можете переопределить порядок выполнения путём использования скобок.

В таблице описан приоритет операций от низшего к высшему.

Таблица 3.7 Приоритет Операций

Тип Операции
Операции
«запятая»,
присвоение= += -= *= /= %= <<= >>= >>>= &= ^= |=
условная?:
логическое ИЛИ||
логическое И&&
побитовое ИЛИ|
побитовое исключающее ИЛИ^
побитовое И&
равенство

!=

!==
соотношение< <= > >= in instanceof
побитовый сдвиг<< >> >>>
сложение/вычитание+ -
умножение/деление* / %
отрицание/инкремент! ~ – + ++ — typeof void delete
вызов/создание экземпляра() new
член. []