1. Глава. Описание
языка.
1.1 Типы данных, переменные и литералы.
Типы данных. JavaScript распознает следующие типы:
- Numbers, такие как 17 или 3.1415928
- Logical (Boolean) , true или false
- Strings, такие как "Hello !"
- null, специальное ключевое слово для обозначения пустого
значения.
Нет явного различия между целыми и действительными
данными. Нет явного типа date, но есть возможность использовать
объект date и его методы для обращения с датами.
1.1.1 Преобразование типов данных.
В JavaScript необязательно определять тип данных
данных и они преобразуются автоматически в процессе выполнения
программы. Так, например, можно определить переменную var str15 =
42, а позже можно присвоить этой же переменной строковое значение
str15 = "This is new value..." и это не вызовет ошибки. В
выражениях, где используются одновременно числовые и строковые
значения, JavaScript преобразует числовое значение к строковому.
Например, в следующих операторах
x = "This is new value - " + 42
y = 42 + " - is new value"
первый возвратит строку " This is new value - 42",
второй - "42 -is new value".
В JavaScript имеются специальные функции для
манипулирования строковыми и числовыми значениями:
- - eval - пытается конвертировать строковое значение к типу
number;
- - parseInt - преобразует строковое значение в целое, если
это возможно;
- - parseFloat - преобразует строковое значение в число с
плавающей запятой, если это возможно.
1.1.2 Переменные.
Имена переменных в JavaScript должны начинаться с
буквы или подчеркивания("_"), последующие символы могут быть также и
цифрами (0-9). Следует учитывать, что JavaScript чувствителен к
регистру. Некоторые примеры правильных имен - Number_hits, temp99, и
_name.
Переменные можно объявить двумя способами: просто
назначая это значение, например, x = 42 или же с ключевым словом
var, например, var x = 19.
Различают глобальные и локальные переменные. Если
переменная объявлена вне функции, то это глобальная переменная и ее
можно использовать везде в текущем документе. Локальная переменная
доступна только в пределах функции. Использование var необязательно,
но нужно использовать это ключевое слово, если желаете иметь
локальную переменную с таким же именем как у глобальной. Имеется
доступ к глобальным переменным одного окна или фрейма в другом окне
или фрейме через их имя. Например, если переменная phoneNumber
обьявлена в родительском фрейме, можно обратиться к этой переменной
из дочернего фрейма как parent.phoneNumber.
1.1.3 Литералы.
Литералы - это константы различных типов.
Целые.
Целые могут выражаться десятичным
числом (основание системы счисления-10), шестнадцатеричным (16), и
восьмеричным (8). Различаются он следующим образом: десятичное
обязательно начинается не с нуля, предшествующий нуль означает, что
это восьмеричное число, а предшествующие 0x ( или 0X ) означают
шестнадцатеричное. Шестнадцатеричное целое может включать цифры
(0-9) и символы a-f и A-F. Восьмеричное целое только цифры 0-7.
Некоторые примеры целых литералов: 17, 0xFFF, и -345.
Литералы с плавающей точкой.
Они могут иметь
следующие части: десятичное целое число, десятичная точка("."),
дробная часть (десятичное целое), признак порядка ("e" или "E") и
порядок (десятичное целое со знаком). Некоторые примеры литералов с
плавающей точкой - 3.1415, -3.1E1, .107e2, и 2E-10.
Литералы Boolean.
Тип Boolean имеет два
значение: true и false.
Строковые литералы.
Это ноль или больше
символов, заключенных в двойные ( " ) или одинарные кавычки (').
Примеры строковых литералов: "row" , 'row' , "4321" , "one line \n
another line" В дополнение к обычным символам, можно также включить
специальные символы, как это показано в последнем элементе. В
следующую таблицу внесены специальные символы, которые можно
использовать в JavaScript.
Символ |
Значение |
\b
|
забой
|
\f
|
перевод страницы
|
\n
|
новая строка
|
\r
|
возврат каретки |
\t
|
табуляция
|
\\
|
двойной обратный слеш
|
Для того чтобы использовать обратный слеш внутри
строки необходимо использовать двойной обратный слеш. Например,
чтобы определить путь к файлу (c:\temp) как строку следует указать
var home = "c:\\temp"
1.2 Выражения и простые
операторы.
Выражение - любой, имеющий значение набор литералов,
переменных, операторов, и выражений, который приводит к
единственному значению. Значение может быть числом, строкой или
Boolean. Специальное ключевое слово null обозначает пустое значение.
Следует различать null и переменные, которым не были присвоены
значения, последние не определены и будут вызывать ошибку во время
выполнения, если используются как числовые переменные. Однако
элементы массива, которым не было присвоено значение оцениваются как
false. В следующем примере исполняется оператор str="Hello !",
потому что элемент массива не определен: myArray=new Array() if
(!myArray["notThere"]) str="Hello !"
1.2.1 Условные выражения.
Условное выражение может иметь одно из двух значений,
в зависимости от условия.
Его синтаксис таков: (condition)? value1: value2
Если условие (condition) истинно, выражение имеет
значение value1, иначе - value2. Можно использовать условное
выражение везде, где допустимо стандартное выражение. Например,
status = (age >= 50) ? "old" : "young"
1.2.2 Оператор
присваивания.
Оператор присваивания (=) присваивает значение
правого операнда левому. То есть x =y присваивает x значение y.
Существует сокращенная форма оператора присваивания, общий вид
которой:
<переменная> <знак операции> =
<выражение>
при этом подразумевается выполнение следующего
оператора присваивания:
<переменная>=<переменная><знак
операции><выражение>
Знаком операции могут быть: +(сложение),
-(вычитание), *(умножение), /(деление), %(деление по модулю),
<<(сдвиг влево), >>(сдвиг вправо), >>>(сдвиг
вправо с заполнением нулями), &(побитовое И), ^(побитовое
исключающее ИЛИ), |(побитовое ИЛИ).
1.2.3 Операторы cравнения.
Операторы сравнения сравнивают операнды и возвращают
логическое значение, основанное на истинности сравнения. Операнды
могут быть числовые или строковые. Когда используются строковые
значения операндов, сравнение проводится с помощью стандартного
лексикографического анализа. Операторы приведены в следующей
таблице:
оператор |
описание оператора |
пример |
равно(==) |
возвращает true, если операнды равны |
x == y |
не равно(!=)
|
озвращает true, если операнды не равны |
x != y |
больше(>)
|
возвращает true, если левый операнд больше |
x > y |
больше или равно(>=)
|
возвращает true, если левый операнд больше или равен
правому |
x >= y |
меньше (<)
|
возвращает true, левый операнд меньше |
x < y |
меньше или равно (<=)
|
возвращает true, левый операнд меньше или равен правому |
x <= y |
1.2.4 Арифметические
операторы.
Стандартные арифметические операторы - сложение(+),
вычитание(-), умножение (*) и деление (/). Эти операторы работают
также, как и в других языках программирования.
Деление по модулю (%).
Оператор деления по
модулю используется следующим образом:var1 % var2, возвращается
остаток от деления var1 на var2. Например, 12%5 возвращает 2.
Приращение(++)(инкремент). Оператор приращения
используется следующим образом: var++ или ++var. Этот оператор
увеличивает (добавляет единицу) операнд и возвращает значение. Если
используется постфиксная форма, то сначала возвращается значение,
затем происходит увеличение. При использовании префиксной формы
сначала происходит увеличение, затем возращение значения. Например,
если x=3, тогда выражение y=x++ приведет к тому, что у=3 и х=4, а
выражение у=++х к тому, что х=4 и у=4.
Уменьшение(--)(декремент). Оператор уменьшения
используется следующим образом: var -- или --var. Этот оператор
уменьшает (вычитает единицу) операнд и возвращает значение. Если
используется постфиксная форма, то сначала возвращается значение,
затем происходит уменьшение. При использовании префиксной формы
сначала происходит уменьшение, затем возращение значения. Например,
если x=3, тогда выражение y=x-- приведет к тому, что у=3 и х=2, а
выражение у=--х к тому, что х=2 и у=2. Одноместное отрицание (-).
Одноместное отрицание предшествует операнду и инвертирует его.
Например, x =-x инвертирует значение x; то есть если x было равно 3,
станет -3.
1.2.5 Битовые операторы.
Битовые операторы обращаются с их операндами как с
набором бит (нулями и единицами), несмотря на то, каким было
исходное число - десятичным, шестнадцатеричным или восьмеричным, оно
предварительно преобразуется к тридцатидвухбитовому целому.
Возвращается стандартное числовое значение. В следующей таблице
приведено описание битовых операторов.
Оператор |
Использование |
Описание |
AND |
a&b |
возвращает 1 в каждый бит результата, если оба
соответствующих бита операндов равны 1 |
OR |
а|b |
возвращает 1 в каждый бит результата, если хотя бы один из
соответствующих битов операндов равен 1 |
XOR |
a^b |
возвращает 1 в битовую позицию, если биты операндов
различны |
NOT |
~a |
инвертирует биты операнда |
Сдвиг влево |
a<<b |
операнд а сдвигается влево на b позиций, справа а
заполняется нулями (соответствует умножению на 2) |
Сдвиг вправо |
a>>b |
операнд а сдвигается вправо на b позиций, освобождающиеся
разряды заполняются знаковым значением |
беззнаковый сдвиг вправо |
a>>>b |
операнд а сдвигается вправо на b позиций, освобождающиеся
разряды заполняются нулями |
1.2.6 Логические
операторы.
Логические операторы должны иметь логические операнды
и возвращают логический результат.
Оператор |
использование |
описание |
AND |
a&&b |
возвращает true, если a=true и b=true |
OR |
a||b |
возвращает false, если a=false и b=false |
NOT |
!a |
возвращает true, если a=false и
наоборот |
1.2.7 Строковые операторы.
В дополнение к операторам сравнения, которые могут
использоваться для сравнения строк, имеется оператор конкатенации,
который используется для слияния строк. Например, "two " + "words"
возвращает значение "two words". Оператор присваивания += может
также использоваться при конкатенации, например, если переменная
mystring имеет значение "alpha" и вычисляется выражение
mystring+="bet", то возвращается результат равный "alphabet",
который присваивается переменной mystring.
1.2.8 Специальные операторы.
new.
Можно использовать оператор new, для того чтобы создать
объект, встроенный или определенный пользователем, встроенные
объекты могут иметь тип Array, Boolean, Date, Function, Math,
Number, или String.
Синтаксис этого оператора следующий:
name = new typ( param1 [,param2] ...[,paramN] )
где name - имя вновь созданного объекта, typ - его тип
и param - параметры.
typeof.
Оператор typeof может быть записан следующим образом:
- typeof операнд
- typeof (операнд)
Возвращается строковое значение, описывающее тип
операнда. Предположим имеются следующие переменные:
- var myFun = new Function("5+2")
- var typ="round"
- var count=1
- var today=new Date()
Оператор typeof возвратит следующие результаты для
них.
- typeof myFun is object
- typeof typ is string
- typeof count is number
- typeof today is object typeof dontExist is undefined
Для ключевых слов true и null, оператор typeof
возвратит результаты:
- typeof true is boolean
- typeof null is object
Для числа или строки результат будет выглядеть
следующим образом:
- typeof 745 is number
- typeof 'Hello !' is string
Свойства объектов (см. далее) оцениваются следующим
образом:
- typeof document.lastModified is string
- typeof window.length is number
- typeof Math.LN2 is number
Для методов и функций возвращается результат:
- typeof blur is function
- typeof eval is function
- typeof parseInt is function
- typeof shape.split is function
Для объектов возвращается результат:
typeof Date is function
typeof Function is function
typeof Math is function
typeof Option is function
void.
Синтаксис оператора:
- javascript:void (expression)
- javascript:void expression
Оператор void определяет выражение, которое не
возвращает никакого значения. Круглые скобки необязательны, но их
использование является хорошим стилем. Можно использовать оператор
void, чтобы определить гипертекстовую ссылку, по которой будет
что-нибудь выполнено, но перехода по ссылке не последует. Следующий
оператор создает ссылку, которая ничего не делает, когда
пользователь активизирует ее. <A
HREF="javascript:void(0)">Click here to do nothing</A>
1.2.9 Приоритеты операторов.
Следующая таблица описывает приоритеты операторов,
сверху вниз от самого высокого до самого низкого, операторы в одной
строке имеют равный приоритет:
() [] .
++ -- ~ !
/ %
+ -
>> << >>>
> >= < <=
== !=
&
^
|
&&
||
?:
=
1.3 Управляющие
операторы JavaScript.
Операторы подразделяются на следующие категории:
- условный оператор: if...else
- операторы цикла: for, while, break, and
continue
- оператор манипулирования объектами: for...in,
new,this, and with
- комментарии:(//) и(/*...*/)
1.3.1 Условный
оператор.
Синтаксис: if (condition) { statements1 [ } else {
statements2 ] }
Если условие condition истинно, выполняется оператор
statements1, иначе statements2. Условие может быть любым
JavaScript-выражением, которое можно оценить как истинное или
ложное. Операторы, которые нужно выполнить, могут быть любыми
JavaScript-операторами, включая условные. Более чем один оператор
должен быть заключен в фигурные скобки, { }. В следующем примере
функция checkData возвращает true, если число символов в объекте
Тext равно трем, в противном случае выводит аварийный бокс и
возвращает false.
function checkData () {
if (document.form1.threeChar.value.length == 3) {
return true
} else {
alert("Enter exactly three characters. " +
document.form1.threeChar.value + " is not valid.")
return false
}
}
1.3.2 Операторы цикла.
Цикл - набор команд, который выполняется неоднократно
до выполнения указанного условия.
JavaScript поддерживает два вида оператора цикла -
for и while.
Внутри операторов могут быть использованы break и
continue. Оператор for ... in также является оператором цикла, но
используется для манипулирования объектом (см. ниже)
Оператор for.
Цикл повторяется до тех пор, пока специфицированное
условие не станет false.
Синтаксис: for ( [начальное выражение]; [условие];
[выражение приращения] ) {операторы}
При выполнении цикла происходит следующее:
- Инициализация начального выражения. Это выражение обычно
содержит одну или несколько переменных цикла, но синтаксис
позволяет выражение любой степени сложности.
- Оценка условия. Если значение условия true, операторы цикла
выполняются. Если значение условия false, цикл прекращается.
- Исполняется выражение приращения.
- Переход к шагу 2.
Пример. Следующий фрагмент программы содержит
операторы, которые подсчитывают количество отбираемых опций в
списке. Оператор цикла объявляет переменную i и инициализирует ее
нулем. Проверяет чтобы i была меньше, чем число опций в объекте,
если это так, исполняется оператор if. После каждого прохода i
увеличивается на единицу.
var numberSelected=0
for (var i=0; i < selectObject.options.length; i++) {
if (selectObject.options[i].selected==true)
numberSelected++
}
Оператор while.
Цикл повторяется до тех пор, пока условие истинно
(true).
Синтаксис: while (условие) {операторы}
Если условие становится ложным (false), цикл
прекращается и управление передается операторам после цикла. Условие
проверяется не непрерывно, а первоначально и после выполнения всех
операторов цикла.
Пример 1. Следующий цикл выполняется, пока n - меньше
3:
n = 0
x = 0
while( n < 3 ) {
n ++
x += n
}
С каждой итерацией, n увеличивается на 1 и
добавляется к x. Поэтому, x и n принимают следующие значения:
- После первого прохода: n = 1 и x = 1
- После второго прохода: n = 2 и x = 3
- После третьего прохода: n = 3 и x = 6
После завершения третьего прохода, условие n < 3
не выполняется, поэтому цикл заканчивается.
Пример 2: Бесконечный цикл. Необходимо удостовериться,
что условие в цикле в конечном счете становиться ложным; иначе, цикл
никогда не будет закончен, как это происходит в данном примере.
while (true) {alert("Hello, world")}
Оператор break.
Этот оператор прерывает цикл for или while и передает
управление оператору, следующему за оператором цикла. Пример. В
следующем фрагменте программы оператор break прерывает цикл, когда
i=3 , и передает управление опера- тору z=i*x.
var i = 0
while (i < 6) {
if (i == 3)
break
i++
}
z= i*x
Оператор continue.
Этот оператор прерывает выполнение операторов внутри
цикла (while или for) и продолжает выполнение цикла с новой
итерации. В противоположность оператору break выполнение цикла не
заканчивается, вместо этого :
- в цикле while происходит переход к проверке
условия;
- в цикле for происходит переход к выражению
приращения.
В следующем примере приведен оператор while с continue,
который выполняется, когда значение i равно 3. Таким образом n
принимает значения 1, 3, 7 и 12.
i = 0
n = 0
while (i < 5) {
i++
if (i == 3)
continue
n += i
}
1.3.3 Оператор манипулирования
объектами.
Таким оператором в JavaScript являются for..in.
Оператор for..in используется для итерирования по всем свойствам
объекта. Для каждого свойства выполняется тело цикла. Выглядит
оператор следующим образом: for (переменная in объект)
{операторы}
1.3.4 Комментарии.
Комментарии - примечания автора, которые объясняют
сценарий. Комментарии игнорируются интерпретатором. JavaScript
поддерживает комментарии в стиле языка Java:
-комментарий, распространяющийся на одну строку,
этому комментария предшествует двойной слеш (//).
-многострочный комментарий, начинающийся с символов
/* и заканчивающийся символами */.
Следующий пример показывает два комментария:
// Это - однострочный комментарий.
/* Это - многострочный комментарий.
Он может иметь любую длину. */
1.4 Функции.
Функции - один из фундаментальных блоков JavaScript.
Функция - JavaScript-процедура - набор операторов, который исполняет
определенную задачу. Чтобы использовать функцию, необходимо сначала
определить ее.
Определение функции состоит из ключевого слова
function, за которым следуют:
- имя функции.
- список аргументов функции, заключенный в круглые скобки.Друг
от друга аргументы отделяются запятыми.
- операторы JavaScript, заключенные в фигурные скобки {}.
Операторы могут включать в себя вызовы функций.
определенных в текущем приложении. Различие между определением и
вызовом функции традиционно для языков программирования. Определение
функции просто называет функцию и задает выполняемые ею действия.
Запрос функции исполняет указанные действия с фактическими
параметрами. Следует определять функции для страницы в разделе HEAD
документа. В этом случае все функции будут определены прежде, чем
показано содержание документа. Иначе, в то время как страница еще не
полностью загружена, пользователь мог бы исполнить действие, которое
вызывает еще не загруженную функцию, что привело бы к ошибке. Пример
простой функции:
function simplefun(str) {
document.write("<HR><P>" + str)
}
Эта функция получает строку str, как аргумент,
добавляет некоторые HTML-признаки к ней с помощью оператора
конкатенации и выводит результат в текущем документе с помощью
метода write.
1.4.1 Использование
функций.
В Navigator'е можете использовать любую функцию,
определенную в текущей странице. Можно также использовать функции,
определенные в других поименованных окнах и фреймах. В
LiveWire-приложениях можно использовать любую функцию
скомпилированную с приложением. Как уже было сказано, определение
функции не исполняет ее. Для того, чтобы функция выполнилась ее
необходимо вызвать. Предположим функция simplefun была определена в
разделе HEAD документа, тогда выполнить ее можно, например,
следующим образом:
<SCRIPT> simplefun()
</SCRIPT>
Аргументы функции не ограничиваются строками и
числами, можно передавать в качестве аргументов также и целые
объекты. Функция может быть в том числе и рекурсивной, то есть может
вызывать сама себя. Например, имеется функция, которая вычисляет
факториал:
function factorial(n) {
if ((n == 0) || (n == 1))
return 1
else {
result = (n * factorial(n-1) )
return result
}
}
Можно вывести результат от одного до пяти следующим
образом:
for (x = 0; x < 5; x++) {
document.write("<BR>", x, " factorial is ", factorial(x))
}
Результаты:
0 factorial is 1
1 factorial is 1
2 factorial is 2
3 factorial is 6
4 factorial is 24
5 factorial is 120
1.4.2 Использование массива
аргументов.
Аргументы функции хранятся в массиве. Внутри функции
можно адресоваться к параметрам следующим образом:
functionName.arguments [i]
где functionName - имя функции и i - порядковый номер
аргумента, начинающийся с нуля. Так, первый аргумент функции,
названной myfunc, есть myfunc.arguments [0]. Общее число аргументов
обозначается переменной arguments.length. При использовании массива
аргументов, можно вызывать функцию с большим количеством аргументов,
чем объявлено. Это часто полезно в том случае, когда заранее не
известно, сколько аргументов будут переданы функции. Чтобы
определить число аргументов фактически переданных функции, можно
использовать arguments.length Например, рассмотрим функцию, которая
создает списки в HTML-документе. Единственный формальный аргумент
функции - строка, которая имеет значение "U" для ненумерованного
списка или "O" для нумерованного. Определение функции:
function list(type) {
document.write("<" + type + "L>") // начало списка
// цикл по аргументам
for (var i = 1; i < list.arguments.length; i++)
document.write("<LI>" + list.arguments[i])
document.write("</" + type + "L>") // end list
}
Можно обращаться к функции с любым числом аргументов
и она будет выводить список указанного типа. Например, следующий
запрос к функции
list("О", "one", 1967, "three", "etc., etc...")
выводит информацию в виде пронумерованного списка, так
как первый аргумент равен О:
1.5 Объекты.
Модель
объекта.
JavaScript основан на простой объектно-ориентируемой
парадигме. Объект строят со свойствами, которые являются переменными
JavaScript или другими объектами. Объект также имеет функции,
связанные с ним, которые называются методами объекта. В дополнение к
объектам, которые встроены в Navigator клиента и LiveWire server,
можно определить свои собственные объекты.
1.5.1 Объекты и
свойства.
Свойства объектов JavaScript доступны следующим
образом:
NameObject.Property
где NameObject- имя объекта, Property - его
свойство.
Предположим имеется объект с именем
department(отдел). Можно определить свойства этого объекта:
название(name),
руководитель(chief),
число сотрудников(number_of_workers) следующим
образом:
department.name = "rk6"
department.chief = "Norenkov I.P."
department.number_of_workers = 23;
Второй способ доступа к свойствам - через массивы.
Свойства и массивы в JavaScript - довольно близки, фактически они
представляют собой различные интерфейсы к одной и той же структуре
данных. Так, например, можно определить свойства объекта department
следующим образом:
department["name"] = "rk6"
department["chief"] = "Norenkov I.P."
department["number_of_workers "] = 23
Этот тип массива известен как ассоциативный, потому
что каждый индекс является строкой. Следующая функция выводит
свойства объекта, когда ей передается объект и имя объекта в
качестве аргументов.
function show_props(obj, obj_name) {
var result = ""
for (var i in obj)
result += obj_name + "." + i + " = " + obj[i] + "\n"
return result
}
Так функция, show_props(department, "department")
выведет следующий результат: department.name = rk6
department.chief = Norenkov I.P.
department.number_of_workers = 23
1.5.2 Создание новых
объектов.
И клиент и сервер JavaScript имеют набор
предопределенных объектов. Кроме этого, есть возможность создавать
свои собственные объекты, для этого необходимо:
- Определить тип объекта с помощью конструктора.
- Создать экземпляр объекта с помощью оператора new.
Для того, чтобы определить тип объекта, создается
функция, в которой определяется имя, свойства, и методы объекта.
Например, предположим, что мы хотим создать объект типа отдел. Мы
хoтим, чтобы он назывался department и имел свойства -
название(name), руководитель(chief), число
сотрудников(number_of_workers) и тема над которой работает
отдел(theme). Функция будет выглядеть следующим образом:
function department(name, chief, number_of_workers, theme)
{ this.name = name
this.chief = chief
this.number_of_workers = number_of_workers
}
Заметим, что значения свойств объекта определяются
значениями, переданными функции. Теперь создадим объект типа
department с именем ourdep:
ourdep = new department("rk6", "Norenkov I.P.", 23)
В том операторе объекту ourdep назначаются следующие
свойства: ourdep.name присваивается строковое значение "rk6",
ourdep. number_of_workers - целое 23 и т.д. Можно создать любое
количество таких объектов, еще один пример: iu6dep = new
department("iu6", "Smirnov U.M", 34). Объект может иметь свойства,
которые являются свойствами другого объекта. Предположим мы
определяем объект person:
function person(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
}
и создаем два экземпляра этого объекта:
fed = new person("Fedoruk V.G.", 43, "M")
trudon = new person("Trudonoshin V.A.", 46, "M")
Теперь мы хотим переопределить объект department,
чтобы он включал новое свойство - сотрудников:
function department(name, chief,number_of_workers, collab)
{ this.name = name
this.chief = chief
this.number_of_workers = number_of_workers
this.collab =collab }
Создаем новые объекты типа department:
ourdep = new department("rk6", "Norenkov I.P.",
23,trudon)
iu6dep = new department("iu6", "Smirnov U.M",
34,fed)
Можно обратить внимание, что при создании объектов
типа department, им в качестве аргументов передаются имена объектов.
Теперь, если мы хотим найти имя сотрудника отдела iu6, то можем
воспользоваться следующей записью:
iu6.collab.name
Заметим, что всегда можно добавить свойства к ранее
определенному объекту, например оператор rk6.theme = "rk6-07"
добавит свойство theme к rk6, и назначит ему значение "rk6-07".
Однако это не повлияет на другие объекты, для добавления новых
свойств ко всем объектам данного типа необходимо изменить
определение объекта.
1.5.3 Использование индексов
для свойств объекта.
В Navigator 2.0, можно обратиться к свойствам объекта
по их названию или по их порядковому индексу. В Navigator3.0, если
первоначально свойство определено с помощью названия, то при
обращении к нему нужно использовать название, если первоначально
воспользовались индексом, то и обращение должно быть с индексом.
Исключением из этого правила - объекты типа form, к ним можно
обратиться как к элементу массива в соответствии с их порядковым
номером (он определяется порядком появления формы в документе) или
по имени. Например, если второй тег <FORM> в документе имеет
аттрибут NAME "myForm", можно обратиться к этой форме двумя
способами:
document.forms[1]
document.forms["myForm"]
1.5.4 Определение свойств
объекта по умолчанию.
Используя свойство prototype можно назначать свойства
всем представителям данного типа, после этого их можно индивидуально
переопределить. В следующем примере имена всех руководителей отделов
(объект типа department) определяется как null, затем они могут быть
изменены
department.prototype.chief=null
1.6 Методы.
Определение методов.
Метод - функция,
связанная с объектом. Метод определяется таким же способом, что и
стандартная функция, для ассоциации с существующим объектом
используется следующий синтаксис:
object.methodname = function_name
где object - существующий объект, methodname - имя,
которое назначается методу, function_name - имя функции. Метод
вызывается следующим образом:
Object.methodname (params);
Можно определить методы для объекта в его
конструкторе, например можно определить функцию, которая выводит
свойства ранее определенного объекта department:
function displayDep() {
var result = " this.name + " " + this.chief
+ " " + this.number_of_workers
show_props (result)
}
где show_props - функция из раздела "Функции" Можно
включить эту функцию в качестве метода department, добавив в
конструктор строку
this.displayDep = displayDep;
То есть полное определение объекта department будет
выглядеть так:
function department(name, chief, number_of_workers, collab) {
this.name = name
this.chief = chief
this.number_of_workers = number_of_workers
this.collab =collab
this.displayDep = displayDep
}
Тогда вызов метода displayDep для конкретных
экземпляров выполняется следующим образом :
ourdep.displayDep()
iu6dep.displayDep()
1.6.1 Использование this для
ссылок на объект.
JavaScript имеет специальное ключевое слово this,
которое можно использовать в пределах метода по отношению к текущему
объекту. Например, предположим, что имеем функцию, названную
validate, которая проверяет значение объекта на нахождение его в
заданных пределах, если значение объекта не входит в указанные
пределы, выводится аварийный бокс:
function validate(obj, lowval, hival) {
if ((obj.value < lowval) || (obj.value > hival))
alert("Invalid Value!")
}
Теперь можно вызвать validate в обработчике событий
(см.далее) onChange при заполнении формы:
<INPUT TYPE = "text" NAME = "age" SIZE = 3
onChange="validate(this, 18, 99)">
Здесь this относится к вызывающему объекту. При
комбинировании со свойствами формы this может относиться к текущей
форме родительского объекта. В следующем примере форма myForm
содержит объекты text и button. Когда пользователь нажимает кнопку,
значение объекта text устанавливается равным имени формы. Обработчик
событий onClick использует this.form для ссылки на родительскую
форму myForm.
<FORM NAME="myForm">
Form name:<INPUT TYPE="text" NAME="text1"
VALUE="Moscow">
<P> <INPUT NAME="button1" TYPE="button"
VALUE="Show Form Name"
onClick="this.form.text1.value=this.form.name"> </FORM>
1.6.2 Удаление
объекта.
В JavaScript для Navigator 2.0 нельзя удалять объекты
- они существуют, пока вы не покинете страницу, содержащую объект. В
JavaScript для Navigator 3.0, можно удалять объекты, устанавливая
ссылку на пустой указатель (если это - последняя ссылка на объект) в
этом случае объект удаляется немедленно.
1.7 Встроенные объекты и их
методы.
Некоторые объекты встроены в JavaScript и могут
использоваться как в клиенте, так и на сервере. Ими являются объекты
типа Array, Boolean, Date, Function, Math, Number, and String.
1.7.1 Объекты
Array.
JavaScript не имеет явного типа данных
-массив(array). Однако, можно использовать встроенный объект Array и
его методы и работать с массивами в приложениях. Объект Array имеет
методы для соединения, перевертывания и сортировки массивов. У него
есть свойство для определения длины массива. Массив есть
упорядоченный набор значений, к которым можно обратиться по имени и
индексу. Создание массивов:
- arrayObjectName = new Array([arrayLength])
- arrayObjectName = new Array([element0, element1, ...,
elementn])
аrrayObjectName является или названием нового объекта
или свойством существующего объекта, аrrayLength - начальная длина
множества. Можно получить доступ к этому значению используя свойство
length; elementn - список значений для элементов множества, когда
использована вторая форма инициализации массива, его длина
определяется количеством аргументов.
Объект Array имеет следующие методы:
- join - связывает все элементы массива в строку;
- reverse переворачивает элементы массива: первый
элемент становится последним и наоборот;
- sort сортирует элементы массива.
Например, предположим, что мы определяем следующий
массив:
myArray = new Array("Wind","Rain","Fire")
тогда myArray.join() возвратит "Wind,Rain,Fire";
myArray.reverse преобразует массив так, что myArray[0]
есть"Fire", myArray[1] есть "Rain", и myArray[2] есть "Wind".
myArray.sort сортирует элементы массива в
лексикографическом порядке, так что myArray[0] есть "Fire",
myArray[1] есть "Rain", и myArray[2] есть "Wind".
Определение элементов массива. Можно определять
элементы массива с помощью оператора присваивания, например:
emp[1] = "Casey Jones"
emp[2] = "Phil Lesh"
emp[3] = "August West"
Можно это сделать при при создании массива:
myArray = new Array("Hello", myVar, 3.14159)
В следующем примере создается двумерный массив и
выводится на экран.
a = new Array(4)
for (i=0; i < 4; i++) {
a[i] = new Array(4)
for (j=0; j < 4; j++) {
a[i][j] = "["+i+","+j+"]"
}
}
for (i=0; i < 4; i++) {
str = "Row "+i+":"
for (j=0; j < 4; j++) {
str += a[i][j]
}
document.write(str,"<p>")
}
Этот пример показывает следующие результаты:
Row 0:[0,0][0,1][0,2][0,3]
Row 1:[1,0][1,1][1,2][1,3]
Row 2:[2,0][2,1][2,2][2,3]
Row 3:[3,0][3,1][3,2][3,3]
Можно обратиться к элементам массива используя
значение элемента или его индекс. Например, в следующем примере
myArray = new Array("Wind","Rain","Fire") Можно обратиться к первому
элементу массива как myArray [0] или myArray ["Wind"].
1.7.2 Объекты
Boolean.
Встроенные объекты Boolean нужно использовать тогда,
когда необходимо преобразовать не-boolean значение в boolean
значение. Можно использовать Boolean в любом месте JavaScript, где
ожидается значение такого типа. JavaScript возвращает значение
объекта Boolean автоматически вызывая метод valueOf.
Создание объектa Boolean:
booleanObjectName = new Boolean(value)
booleanObjectName - или имя нового объекта или свойство
существующего, value - начальное значение объекта. Значение
преобразуется к типу boolean, если необходимо. Если значение опущено
или 0, null, false или пустая строка "", объект инициализируется
значением false, Во всех других случаях, включая строку "false",
создается объект с начальным значением true. В следующем примере
создаются два объекта Boolean
bfalse = new Boolean(false)
btrue = new Boolean(true)
1.7.3 Объект
Date.
JavaScript не имеет данных типа date. Однако, можно
использовать объект Date и его методы для работы с датами и
временами в приложениях. Объект Date имеет большое количество
методов для установки, получения, и управления датами. У него нет
свойств. JavaScript обращается с датами подобно языку Java. Эти два
языка имеют много одинаковых методов и хранят даты как число
миллисекунд. прошедших с 1 января 1970г, 00:00:00.
Примечание. В
настоящее время нельзя работать с датами до 1 января
1970г.
Создание объекта Date:
dateObjectName = new Date([parameters])
где dateObjectName - имя создаваемого объекта, это
может быть новый объект или свойство существующего объекта.
Параметры могут задаваться следующим образом:
- опущены: создается текущие дата и время, например,
today= new Date();
- определяется строка в формате "месяц день, год
часы:минуты:секунды", например, Xmas95 =new Date("December 25, 1995
13:30:00"). Если опускаются часы, минуты или секунды они
устанавливаются в нуль;
- задается целое значение года, месяца и дня, например,
Xmas95 = new Date(95,11,25).
- задается целое значение года, месяца, дня, часов,
минут, секунд.
Методы объекта Date.
Методы для обработки дат и времен можно разделить на
следующие категории:
- "set" методы, для установки дат и времен;
- "get" методы, для получения дат и времен;
- "to" методы, для получения строковых значений;
- parse и UTC методы, для грамматического разбора строк с
датами.
С помощью "get" и "set" методов можно получать и
устанавливать секунды, минуты, часы, дни месяца, дни недели, месяцы,
и годы независимо друг от друга. Имеется метод getDay, возвращающий
день недели, но нет соответствующего метода setDay, поскольку день
недели устанавливается автоматически.
В методах используются следующие целые значения:
-секунды и минуты: 0 - 59
-часы: 0 - 23
-день недели: 0 - 6
-день месяца: 1 - 31 -месяц: 0 (январь) - 11
(декабрь)
-год: с 1900
Например, если вы установили следующую дату:
Xmas95 = new Date("December 25, 1995")
то Xmas95.getMonth() возвратит 11, а Xmas95.getYear()
возвратит 95. Методы getTime и setTime полезны для сравнения дат.
Метод getTime возвращает число миллисекунд начиная с 01.01.1970.
Следующий пример выводит число дней, прошедших в текущем году:
today = new Date()
endYear = new Date("December 31, 1990") // Установили
день и месяц endYear.setYear(today.getYear()) // Установили текущий
год
msPerDay = 24 * 60 * 60 * 1000 // Число миллисекунд за
день
daysLeft = (endYear.getTime() - today.getTime()) /
msPerDay
daysLeft = Math.round(daysLeft) document.write("Number
of days left in the year: " + daysLeft)
В этом примере создается объект Date c именем today,
который содержит текущую дату. endYear определяет начало текущего
года. Тогда, используя число миллисекунд за день, вычисляем число
дней между today и endYear, используя getTime, и округляем число
дней до целого.
Метод parse полезен для присваивания даты
существующему объекту из строкового значения. Например, следующий
пример использует parse и setTime для назначения даты объекту
mydate:
mydate = new Date() mydate.setTime(Date.parse("Aug 9,
1995"))
Пример использования объекта Date. В этом примере в
HTML области показываются непрерывно обновляемые цифровые часы. Это
осуществимо, поскольку есть возможность динамически изменить
содержание области текста в JavaScript (в отличие от обычного
текста, который нельзя модернизировать без перезагрузки документа).
Вывод в навигаторе выглядит следующим образом:
Раздел <BODY> документа выглядит так:
<BODY onLoad="JSClock()">
<FORM NAME="clockForm"> The current time is
<INPUT TYPE="text" NAME="digits" SIZE=12 VALUE="">
</FORM> </BODY>
Тег <BODY> включает обработчик событий onLoad.
Когда страница загружается обработчик вызывает функцию JSClock,
определяемую в разделе <HEAD>. Форма clockForm включает
простое текстовое поле digits, в котором инициализирована пустая
строка. В разделе <HEAD> документа JSClock определяется
следующим образом:
<HEAD> <SCRIPT language="JavaScript">
<!-- function JSClock() {
var time = new Date()
var hour = time.getHours()
var minute = time.getMinutes()
var second = time.getSeconds()
var temp = "" + hour
temp += ((minute < 10) ? ":0" : ":") + minute
temp += ((second < 10) ? ":0" : ":") + second
document.clockForm.digits.value = temp
id = setTimeout("JSClock()",1000) } //-->
</SCRIPT>
Функция JSClock сначала создает новый объект Date, с
именем time; так как аргументы не заданы, устанавливаются текущие
значения. Запросы к getHours, getMinutes, и getSeconds выделяют
значение текущего часа, минуты и секунды. Следующие четыре оператора
строят строковое значение времени. Полученное значение присваивается
области текста: document.clockform.digits.value = temp, тем самым
время будет показано в документе. Конечный оператор в функции -
рекурсивный запрос к JSClock: id=setTimeout("JSClock()",1000)
Встроенная в JavaScript функция setTimeout определяет время задержки
для для обращения к JSClock. Второй аргумент указывает задержку в
1000 миллисекунд. Таким образом модернизируется показ времени в
форме с интервалом одна секунда. Обратите внимание, функция
возвращает значение присваиваемое id, которое в данном случае нигде
не используется, но может быть использовано в методе clearTimeout
для обнуления.
1.7.4 Объект
Function.
Создание объекта Function:
functionObjectName = new Function ([arg1, arg2, ...
argn], functionBody)
functionObjectName - имя переменной или свойство
существующего объекта. При использовании свойств функции,
functionObjectName должен быть или именем существующего объекта или
свойством существующего объекта. аrg1, arg2, ... argn - аргументы,
которые используются функцией как формальные параметры. Каждый из
параметров должен быть строкой, которая допустима в JavaScript как
идентификатор; например " x "или"theForm ". functionBody - строка,
специфицирующая JavaScript-коды, которые нужно компилировать как
тело функции.
Объекты function обрабатываются каждый раз, когда они
используются. Это менее эффективно, чем объявление функции и их
вызов, потому что объявленные функции компилируются.
Следующий пример назначает функцию переменной
setBGColor. Эта функция устанавливает цвет фона текущего
документа.
var setBGColor = new
Function("document.bgColor='antiquewhite'")
Для вызова объекта Function, нужно специфицировать имя
переменной, как будто это функция, например:
var colorChoice="antiquewhite" if
(colorChoice=="antiquewhite") {setBGColor()}
Можно назначить функцию обработчиком событий
следующими способами:
- document.form1.colorButton.onclick=setBGColor
- <INPUT NAME="colorButton" TYPE="button" VALUE="Change
background color" onClick="setBGColor()">
Создание переменной setBGColor похоже на обычное
декларирование функции.
function setBGColor() {
document.bgColor='antiquewhite' }
Назначение функции переменной подобно объявлению
функции, но есть различия: когда для функции назначается переменная
setBGColor = new Function("..."), setBGColor является переменной,
текущее значение которой относиться к функции, созданной с помощью
new Function(), когда создается функция с помощью function
setBGColor() {...}, setBGColor не является переменной, это имя
функции.
1.7.5 Объект
Math.
Встроенный объект Math имеет свойства и методы для
ма- тематических констант и функций. Например, свойство PI объекта
Math имеет значение 3.141..., который можно использовать как Math.PI
Стандартные математические функции являются методами Math. Они
включают тригонометрические, логарифмические, показательные, и
другие функции. Например, если нужно использовать синус, следует
писать Math.sin (1.56) Обратите внимание что все тригонометрические
методы Math используют аргументы в радианах. В следующей таблице
приведены методы Math.
Метод |
Описание |
abs
|
абсолютное значение
|
sin, cos, tan
|
стандартные тригонометрические функции, аргумент в
радианах
|
acos, asin, atan
|
обратные тригонометрические функции, возвращают значение в
радианах
|
exp, log
|
экспонента и натуральный логарифм
|
ceil
|
возвращает наименьшее целое, большее или равное
аргументу
|
floor
|
возвращает наибольшее целое, меньшее или равное
аргументу
|
min, max
|
возвращает меньшее или большее (соответственно) из двух
аргументов
|
pow
|
возведение в степень, первый аргумент основание, второй
показатель степени
|
round
|
округляет аргумент до ближайшего целого
|
sqrt
|
квадратный корень
|
Часто удобно использовать оператор with, когда есть
раздел, в котором используется набор констант и методов, чтобы не
повторять слово "Math".
Например:
with (Math) { a = PI * r*r; y = r*sin(alfa); x =
r*cos(alfa) }
1.7.6 Объект
Number.
Этот объект имеет свойства для цифровых констант
такие как максимальное значение, неопределенность, бесконечность.
Эти свойства можно использовать следующим образом:
biggestNum = Number.MAX_VALUE
smallestNum = Number.MIN_VALUE
infiniteNum = Number.POSITIVE_INFINITY
negInfiniteNum = Number.NEGATIVE_INFINITY
notANum = Number.NaN
В следующей таблице приведены свойства
Number:
Название |
Описание |
MAX_VALUE
|
наибольшее значение
|
MIN_VALUE
|
наименьшее значение
|
NaN
|
неопределенность
|
NEGATIVE_INFINITY
|
отрицательная бесконечность
|
POSITIVE_INFINITY
|
положительная бесконечность
|
1.7.7 Объект
String.
У JavaScript нет типа данных string. Однако можно
пользоваться объектом String и его методами для работы со строками в
прилoжениях. Этот объект имеет множество методов и одно свойство -
длину строки.
Создание объекта String:
stringObjectName = new String(string)
stringObjectName - имя нового объекта String, string -
любая строка.
Например, следующий оператор создает объект String,
названный mystring:
mystring = new String ("Hello, World!")
аналогичные действия выполняет и оператор:
mystring="Hello, World!"
Строковые литералы также являются объектами String.
Свойство length для строки указывает число символов в ней, так x =
mystring.length присвоит значение х равное тринадцати, потому что
"Hello, World!" имеет 13 символов.
Объект String имеет два типа методов - те, которые
возвращают в качестве результата преобразованную исходную строку
(как, например, подстроку или строку, у которой все символы
переведены в верхний регистр) и те, которые возвращают строку в
формате HTML (например link).
Например mystring.toUpperCase() and
"hello,world!".toUpperCase() возвратят строку "HELLO, WORLD!". Метод
substring имеет два аргумента и возвращает подстроку,
располагающуюся между указанными номерами, например,
mystring.substring(4, 9) возратит строку "o,Wo".
Методы bold и link используются для HTML-
форматирования, первый создает жирный текст, второй гипертекстовую
ссылку. Например, для создания ссылки к гипотетическому URL с
помощью метода link можно воспользоваться следующим оператором:
mystring.link("http://www.helloworld.com")
Следующая таблица показывает методы объектов
Sring:
Метод |
описание |
anchor
|
создает HTML-якорь
|
big, blink, bold, fixed,
italics, small, strike, sub,
sup
|
создает строку HTML, соответствующего вида
|
charAt
|
возвращает символ по его номеру в строке
|
ndexOf, lastIndexOf
|
возвращают первую (последнюю) позицию специфицированной
подстроки
|
link
|
создает гипертекстовую ссылку
|
split
|
разбивает объект String на массив подстрок
|
substring
|
извлекает подстроку из строки
|
toLowerCase, toUpperCase
|
возвращает строку в нижнем или верхнем регистре,
соответственно
|
1.8 Встроенные функции.
1.8.1 Функция
isNaN.
Функция оценивает аргумент на неопределенность.
Синтаксис: isNaN(testValue)
где testValue -значение, которое вы хотите оценить.
На платформах, которые поддерживают NaN, функции
parseFloat и parseInt (см. ниже) возвращают "NaN", когда значение не
является числом. isNaN возвращает true если "NaN," и false в другом
случае. В следующей программе оценивается значение floatValue и
вызывается соответствующая процедура:
floatValue=parseFloat(toFloat) if
(isNaN(floatValue))
{ notFloat() } else { isFloat() }
1.8.2 Функции parseInt и
parseFloat.
Эти функции возвращают числовое значение строкового
аргумента.
Синтаксис parseFloat: parseFloat(str)
parseFloat выполняет лексикографический разбор строки
и, если это возможно, возвращает число с плавающей точкой.
Если в строке встречаются символы отличные от знака (+
или -), цифры (0-9), десятичной точки или экспоненты, разбор
прекращается и возвращается значение, полученное до этого момента,
остальные символы игнорируются. Если самый первый символ не может
быть преобразован в число возвращается"NaN" (not a number).
Синтаксис parseInt: parseInt(str [, radix])
parseInt выполняет лексикографический разбор первого
аргумента - строки str, и возвращает целое по основанию, заданным
вторым необязательным аргументом radix. Например radix 10
показывает, что строку нужно преобразовывать в десятичное число, 8 в
восьмеричное, 16 в шестнадцатиричное и так далее. При основании
больше десяти для обозначения цифр используются буквы в алфавитном
порядке. Преобразование выполняется до первого недопустимого
символа, остальные символы игнорируются, если первый символ не может
быть преобразован возвращается "NaN".