Электронная библиотека
Программисту веб-дизайнеру
Другие материалы
Клиентский JavaScript. Руководство по Использованию
В этой главе рассматриваются выражения и операции JavaScript, в том числе - операции присвоения, сравнения, арифметические, битовые, логические, строковые и специальные.
В главе имеются следующие разделы:
Выражение\expression это правильный набор литералов, переменных, операций и выражений, который вычисляется в единственное значение; значение может быть числом, строкой или логическим значением.
Концептуально имеются выражения двух типов: присваивающие значение переменной, и
те, которые просто имеют значение. Например, выражение x = 7
присваивает переменной x значение 7. Это выражение вычисляется в 7. Такие
выражения используют операции присвоения.
Выражение 3 + 4
вычисляется в 7; оно выполняет
операцию присвоения значения. Операции в таких выражениях называются просто операции.
В JavaScript имеются следующие типы выражений:
В этом разделе рассматриваются операции и приоритет выполнения. В JavaScript имеются следующие типы операций:
В JavaScript есть как бинарные, так и унарные операции. Бинарная операция работает с двумя операндами, один - до знака операции, другой - после:
операнд1 операция операнд2
Для унарной операции нужен один операнд, до или после знака операции:
операция операнд
операнд операция
Кроме того, в JavaScript имеется тернарная условная операция. Тернарная операция требует трех операндов.
Операция присвоения присваивает левому операнду значение правого операнда. Базовой операцией присвоения является "равно" (=), которая присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение у переменной х.
Другие операции присвоения являются аббревиатурами стандартных операций, как видно из таблицы.
Таблица 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
x ^= y
x = x ^ y
x |= y
x = x | y
Операция сравнения сравнивает операнды и возвращает значение, основанное на true/верности сравнения. Операнды могут быть числами или строками. Строки сравниваются на основе стандартного лексикографического (словарного) порядка с использованием Unicode-значений. В таблице даны операции сравнения.
Таблица 3.2 Операции сравнения
Возвращает 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
1В этих примерах принимается, что переменной var1
присвоено
значение 3, а переменной var2
присвоено значение 4.
Арифметические операции принимают в качестве операндов числовые значения (литералы или переменные) и возвращают единственное значение-результат. Стандартными арифметическими операциями являются операции сложения (+), вычитания (-), умножения (*) и деления (/). Эти операции работают так же, как и в большинстве других языков программирования, только операция / в JavaScript возвращает частное с плавающей точкой, а не округленное частное, как в C или Java. Например:
1/2 //возвращает 0.5 в JavaScript
1/2 //возвращает 0 в Java
Кроме того, JavaScript предоставляет арифметические операции, перечисленные в таблице.
Таблица 3.3 Арифметические операции
Бинарная операция. Возвращает целочисленный остаток от деления двух операндов.
Унарная операция. Прибавляет 1 к операнду. Если используется как префикс (++x
),
возвращает значение операнда после прибавления 1; если используется как
постфикс (x++
), возвращает значение операнда до прибавления 1.
Если x
равен 3, то ++x
устанавливает 4 в x
и возвращает 4, а x++
устанавливает 4 в x
и возвращает 3.
Унарная операция. Вычитает 1 из операнда. Возвращаемые значения аналогичны оператору инкремента.
Если x
равен 3, то --x
устанавливает 2 в x
и возвращает 2, а x++
устанавливает 2 в x
и возвращает 3.
Унарная операция. Возвращает отрицание операнда.
Если x
равен 3, то -x
возвращает -3.
Битовые операции рассматривают свои операнды как 32-битные целые значения (последовательность 0 и 1), а не как 10-ричные, 16-ричные или 8-ричные числа. Например, десятеричное 9 имеет бинарное представление 1001. Битовые операции выполняются над такими двоичными представлениями, но возвращают стандартные числовые значения JavaScript.
В таблице приведены битовые операции JavaScript.
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
битов вправо, отбрасывая смещенные биты и заполняя слева нулями.
Концептуально битовые логические операции работают так:
Например, цифра 9 имеет двоичное/бинарное представление 1001, а цифра 15 - 1111. Поэтому результаты применения битовых операций к этим значениям будут такими:
Операции битового сдвига принимают два операнда: первый это сдвигаемое число, а второй специфицирует количество битовых позиций, на которое сдвигается первый операнд. Направление сдвига контролируется самой операцией.
Операции сдвига конвертируют свои операнды в 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. Для неотрицательных чисел сдвиг вправо с заполнением нулями и сдвиг вправо с сохранением знака дают одинаковые результаты.
Логические операции обычно используются с Булевыми (логическими) значения; эти операции возвращают Булево значение. Однако операции && и || в действительности возвращают значение одного из специфицированных операндов, поэтому, если эти операции используются с не-Булевыми значениями, они могут вернуть не-Булево значение. Логические операции перечислены в таблице.
Таблица 3.6 Логические операции
expr1 && expr2
(Логическое И) Возвращает expr1
, если может быть конвертировано в false;
иначе возвращает expr2
. Таким образом, при использовании с Булевыми значениями &&
возвращает true, если оба операнда true; иначе, возвращает false.
expr1 || expr2
(Логическое ИЛИ) Возвращает expr1
, если может быть конвертировано в false;
иначе возвращает expr2
. Таким образом, при использовании с Булевыми значениями ||
возвращает true, если любой из операндов true; если оба false, возвращает false.
!expr
(Логическое НЕ) Возвращает false, если ее единственный операнд может быть конвертирован в true; иначе возвращает true.
Примерами выражений, которые могут быть конвертированы в false, являются выражения, вычисляемые в null, 0, пустую строку ("") или undefined.
А это примеры операции && (logical AND).
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
Следующий код это примеры операции || (logical OR).
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
Следующий код это примеры операции ! (logical NOT).
n1=!true // !t возвращает false
n2=!false // !f возвращает true
n3=!"Cat" // !t возвращает false
Поскольку логические выражения вычисляются слева направо, они проверяются на возможность "сокращенного/short-circuit" вычисления по следующим правилам:
false
&& anything ускоренно вычисляется в false.true
|| anything ускоренно вычисляется в true.Правила логики гарантируют, что эти вычисления всегда корректны. Обратите внимание, что часть anything вышеприведенных выражений не вычисляется, поэтому выполнение полного вычисления не даст никакого эффекта.
Помимо операций сравнения, которые могут использоваться со строковыми значениями,
операция конкатенации (+) объединяет два строковых значения, возвращая строку,
которая является результатом объединения двух строк-операндов. Например, "my " + "string"
возвращает строку "my string"
.
Операция-аббревиатура присвоения += также может использоваться для конкатенации
строк. Например, если переменная mystring
имеет значение "alpha",
то выражение mystring += "bet"
вычисляется в "alphabet" и
это значение присваивается переменной mystring
.
В JavaScript имеются следующие специальные операции:
Условная операция это единственная операция JavaScript, принимающая три операнда. Эта операция может иметь одно из двух значений на основе выполнения условия. Синтаксис таков:
condition ? val1 : val2
Если condition
true, операция выдает значение val1
.
Иначе она выдает значение val2
. Вы можете использовать условную
операцию там же, где используется стандартный оператор if.
status = (age >= 18) ? "adult" : "minor"
Этот оператор присваивает значение "adult" переменной status
, если age
имеет значение 18 или более. Иначе переменной status
присваивается значение "minor".
Операция "запятая" (,
) просто вычисляет два операнда и
возвращает значение второго операнда. Эта операция используется в основном в
цикле for
, позволяя обновлять несколько переменных при каждом проходе цикла.
Например, если a
это 2-мерный массив из 10 элементов по измерению,
следующий код использует операцию , для инкремента сразу двух переменных. Код
печатает значения элементов по диагонали массива:
for (var i=0, j=9; i <= 9; i++, j--)
document.writeln("a["+i+","+j+"]= " + a[i,j])
Операция 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 (можно удалять объект, определенный пользователем)
Если Вы удаляете элемент массива, размер массива не изменяется. Например, если Вы удаляете 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) {
// здесь операторы будут выполняться
}
Операция new
используется для создания нового экземпляра объекта
пользовательского типа или предопределенных типов Array
, Boolean
, Date
, Function
, Image
, Number
, Object
, Option
, RegExp
или String
. На сервере Вы можете также использовать эту операцию с
объектами DbPool
, Lock
, File
или SendMail
.
Используйте new
так:
objectName = new objectType ( param1 [,param2] ...[,paramN] )
Вы можете также создавать объекты с использованием инициализаторов объектов, как описано в разделе "Использование Инициализаторов Объектов".
См. также new
в книге
Клиентский JavaScript.
Справочник.
Используйте ключевое слово this
для обращения к текущему объекту.
Вообще this
ссылается на вызывающий объект в методе. Используйте this
так:
this[.propertyName]
Пример 1. Функция validate
проверяет свойство value
объекта, имея high и low-значения:
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. В сочетании со свойством form
, слово 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>
Операция 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 object
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
Операция void используется одним из следующих способов:
1. void (expression)
2. void expression
Операция void специфицирует выражение, вычисляемое без возвращения значения.
expression
это вычисляемое выражение JavaScript. Скобки вокруг expression
не обязательны, но их использование является хорошим стилем.
Вы можете использовать операцию void
для специфицирования выражения
как гиперссылки. Выражение вычисляется, но не загружается вместо текущего документа.
Следующий код создает гиперссылку, которая не выполняет никаких действий, если
пользователь щелкнет по ней. Если пользователь щелкает по этой ссылке, void(0)
вычисляется в 0, но это не вызывает никаких действий в JavaScript.
<A HREF="javascript:void(0)">Click here to do nothing</A>
Следующий код создает гиперссылку, которая отправляет форму на сервер, если пользователь щелкнул по этой ссылке.
<A HREF="javascript:void(document.form.submit())">
Click here to submit</A>
Приоритет операций определяет порядок, в котором они выполняются при вычислении выражения. Вы можете переопределить приоритет операций путем использования скобок.
В следующей таблице показан приоритет выполнения операций, от низшего к высшему.
Таблица 3.7 Приоритет операций
,
= += -= *= /= %= <<= >>= >>>= &= ^= |=
?:
||
&&
|
^
&
== !=
< <= > >=
<< >> >>>
+ -
* / %
! ~ - + ++ -- typeof void delete
()
new
. []
Оглавление | Назад | Вперед | Индекс