Клиентский JavaScript 1.3 Руководство

         

Операторы



Глава 5
Операторы

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

В главе имеются следующие разделы, в которых дан краткий обзор каждого оператора:

Условные операторы: if...else и switch

Операторы циклов: for, while, do while, label, break и continue (label сам по себе не оператор цикла, но часто используется с этими операторами)

Операторы манипулирования объектами: for...in и with

Комментарии

Любое выражение также является оператором. См. в

Главе 3 "Выражения и Операторы" полную информацию об операторах.

Используйте точку с запятой (;) для разделения операторов в коде JavaScript.

См. в книге Клиентский JavaScript. Справочник. детальную информацию об операторах данной главы.



Оператор break



Оператор break

Оператор break используется для прерывания выполнения цикла, либо операторов switch или label.

Когда Вы используете break с операторами while, do-while, for или switch, оператор break немедленно прерывает самый внутренний цикл или switch и передаёт управление следующему оператору.

Когда Вы используете break внутри оператора label, он прерывает этот оператор и передаёт управление следующему оператору. Если Вы специфицировали label при вызове break, оператор break прерывает специфицированный оператор.



Синтаксис break выглядит так:

1. break
2. break [label]

Первая форма прерывает самый внутренний цикл, switch или label; вторая форма прерывает специфицированный содержащий оператор label.

Пример. Здесь происходит итерация по элементам массива, пока не будет найден индекс элемента, значением которого является theValue:

for (i = 0; i < a.length; i++) {
if (a[i] = theValue);
      break;
}



Оператор continue



Оператор continue

Оператор continue может использоваться для рестарта оператора while, do-while, for или label.

В операторах while или for, оператор continue прерывает текущий цикл и начинает новую итерацию (проход) цикла. В отличие от break, continue не прерывает полностью выполнение цикла. В цикле while он перескакивает на condition. В цикле for он перескакивает на increment-expression.

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

Синтаксис оператора continue выглядит так:

1. continue
2. continue [label]



Оператор do...while



Оператор do...while

Оператор do...while повторяется, пока специфицированное выражение не станет false. Оператор do...while выглядит так:

do {
   statement
} while (condition)

statement выполняется как минимум один раз, так как находится перед проверяемым условием. Если condition возвращает true, цикл выполняется ещё раз. В конце каждого прохода проверяется условие. Если condition возвращает false, выполнение останавливается и управление передаётся оператору, идущему после do...while.

Пример. В следующем примере цикл do итерирует как минимум один раз, пока i не станет меньше 5.

do {
   i+=1;
   document.write(i);
} while (i<5);



Оператор for


Оператор for

Оператор for повторяется, пока специфицированное условие не станет false. JavaScript-цикл for похож на аналогичные циклы Java и C. Оператор for выглядит так:

for ([initialExpression]; [condition]; [incrementExpression]) {
statements
}

При выполнении цикла for происходит следующее:

Выполняется инициализирующее выражение initial-expression, если имеется. Это выражение обычно инициализирует один или более счётчиков цикла, но синтаксис допускает выражения любой сложности.

Выражение condition вычисляется. Если condition даёт true, цикл выполняется. Если condition равно false, цикл for прерывается.Выполняются statements/операторы.

Выполняется выражения обновления incrementExpression, и управление возвращается к шагу 2.

Пример. Эта функция содержит оператор for, подсчитывающий количество выбранных опций в прокручиваемом списке (объекте Select, который позволяет делать множественный выбор). Оператор for объявляет переменную i и инициализирует её значением 0 (нуль). Если i меньше количества опций объекта Select, выполняется следующий оператор if, а i увеличивается на 1 при каждом прохождении цикла.

<SCRIPT>
function howMany(selectObject) {
   var numberSelected=0
   for (var i=0; i < selectObject.options.length; i++) {
      if (selectObject.options[i].selected==true)
         numberSelected++
   }
   return numberSelected
}
</SCRIPT><FORM NAME="selectForm">
<P><B>Choose some music types, then click the button below:</B>
<BR><SELECT NAME="musicTypes" MULTIPLE>
<OPTION SELECTED> R&B
<OPTION> Jazz
<OPTION> Blues
<OPTION> New Age
<OPTION> Classical
<OPTION> Opera
</SELECT>
<P><INPUT TYPE="button" VALUE="How many are selected?"
onClick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))">
</FORM>



Оператор for...in



Оператор for...in

Оператор for...in итерирует специфицированную переменную по всем свойствам объекта. Для каждого отдельного свойства JavaScript выполняет специфицированные операторы. Цикл for...in выглядит так:

for (variable in object) {
statements }

Пример. Следующая функция принимает в качестве аргументов объект и имя объекта. Затем итерирует по всем свойствам объекта и возвращает строку - список свойств объекта и их значений.

function dump_props(obj, obj_name) {
   var result = ""
   for (var i in obj) {
      result += obj_name + "." + i + " = " + obj[i] + "<BR>"
   }
   result += "<HR>"
   return result
}

Для объекта car со свойствами make и model, result будет:

car.make = Ford
car.model = Mustang



Оператор if...else



Оператор if...else

Оператор if используется для выполнения определённых операторов, если логическое условие true; не обязательный блок else выполняется, если условие false. Оператор if выглядит так:

if (condition) {
statements1
}
[else {
   statements2
} ]

condition это может быть любое выражение JavaScript, которое вычисляется в true или false. Выполняемые операторы это любые операторы JavaScript, включая вложенные if. Если Вы хотите использовать более одного оператора после операторов if или else, Вы обязаны заключать их в фигурные скобки {}.

Не путайте примитивные Boolean-значения true и false со значениями true и false объекта Boolean. Любой объект, значением которого не является undefined или null, включая объект Boolean со значением false, вычисляется в true, когда передаётся в условный оператор. Например:

var b = new Boolean(false);
if (b) // это условие вычисляется в true

Пример. В следующем примере функция checkData возвращает true, если количество символов в объекте Text равно трём; иначе выводит диалог alert и возвращает 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
   }
}



Оператор label


Оператор label

Оператор label предоставляет оператор с идентификатором, что позволяет обратиться к нему в программе. Например, Вы можете использовать label для идентифицирования цикла, а затем использовать break или continue для указания момента, когда программа должна прервать выполнение цикла или начать новую итерацию.

Синтаксис оператора label примерно такой:

label :
   statement

Значение label это любой идентификатор JavaScript, не являющийся зарезервированным словом. statement\оператор , идентифицируемый Вами с помощью label, может быть любого типа.

Пример. Здесь label markLoop идентифицирует цикл while.

markLoop:
while (theMark == true)
   doSomething();
}



Оператор switch



Оператор switch

Оператор switch позволяет вычислять выражение и пытается найти совпадение значения выражения с оператором label. Если совпадение найдено, программа выполняет ассоциированный оператор. Оператор switch выглядит так:

switch (expression){
   case label :
      statement;
      break;
   case label :
      statement;
      break;
   ...
   default : statement;
}

Программа сначала ищет label/метку, совпадающую по значению с выражением, а затем выполняет ассоциированный оператор. Если совпадающий label не найден, программа ищет не обязательный оператор по умолчанию и, если он найден, выполняет ассоциированный оператор. Если оператор по умолчанию/default statement на найден, программа продолжает выполняться с оператора, идущего после конца switch.

Не обязательный оператор break, ассоциируемый с каждым case, гарантирует, что программа прервёт выполнение блока switch, как только будет выполнен совпавший оператор, и продолжит выполнение с оператора, идущего после switch. Если break отсутствует, программа продолжит выполнение следующего оператора в блоке switch.

Пример. В следующем примере, если expr вычисляется в "Bananas", программа находит совпадение с case "Bananas" и выполняет ассоциированный оператор. Если обнаружен break, программа прерывает выполнение блока switch и выполняет оператор, идущий после switch. Если break отсутствует, оператор для case "Cherries" также будет выполнен.

switch (expr) {
   case "Oranges" :
      document.write("Oranges are $0.59 a pound.<BR>");
      break;
   case "Apples" :
      document.write("Apples are $0.32 a pound.<BR>");
      break;
   case "Bananas" :
      document.write("Bananas are $0.48 a pound.<BR>");
      break;
   case "Cherries" :
      document.write("Cherries are $3.00 a pound.<BR>");
      break;
   default :
      document.write("Sorry, we are out of " + i + ".<BR>");
}document.write("Is there anything else you'd like?<BR>");



Оператор while



Оператор while

Оператор while выполняется, пока специфицированное условие вычисляется в true. Оператор while выглядит так:

while (condition) {
statements
}

Если condition становится false, операторы внутри цикла перестают выполняться и управление передаётся оператору, идущему после цикла.

Проверка условия/condition выполняется перед началом каждого цикла. Если condition возвращает true, операторы выполняются и условие проверяется снова. Если condition возвращает false, выполнение прекращается и управление передаётся оператору, идущему после цикла while.



Оператор with


Оператор with

Оператор with устанавливает объект по умолчанию для блока операторов. JavaScript ищет неквалифицированные имена в на боре операторов для определения, являются ли имена свойствами объекта пор умолчанию. Если неквалифицированное имя совпадает со свойством, то свойство используется в операторе; иначе используется локальная или глобальная переменная.

Оператор with выглядит так:

with (object){
   statements
}

Пример. Оператор with специфицирует, что объект Math является объектом по умолчанию. Оператор, идущий после оператора with, обращается к свойству PI и методам cos и sin без специфицирования объекта. JavaScript принимает Math как объект для этих свойств.

var a, x, y
var r=10
with (Math) {
   a = PI * r * r
   x = r * cos(PI)
   y = r * sin(PI/2)
}



Операторы циклов


Цикл/loop это набор команд, которые выполняются неоднократно, пока не будет выполнено специфицированное условие. JavaScript поддерживает операторы циклов for, do while, while и label (label сам по себе не является оператором цикла, но часто используется с этими операторами). Кроме того, Вы можете использовать операторы break и continue с операторами циклов.

Ещё один оператор, for...in, выполняет операторы циклически, но используется при работе с объектами. См. "Операторы Манипуляций с Объектами".



Операторы манипулирования объектами


JavaScript использует операторы for...in и with для работы с объектами.



Следующий цикл while итерирует, пока


Следующий цикл while итерирует, пока n меньше 3:
n = 0
x = 0
while( n < 3 ) {
   n ++
   x += n
}
При каждой итерации выполняется инкремент n и обновляется значение x. Следовательно, x и n получают следующие значения:

После первого прохода: n = 1 и x = 1
После второго прохода: n = 2 и x = 3
После третьего прохода: n = 3 и x = 6
После третьего прохода условие n < 3 больше не true, поэтому цикл прерывается.

с оператором continue выполняется, если


здесь цикл while с оператором continue выполняется, если i имеет значение 3. Таким образом, n получает значения 1, 3, 7 и 12.
i = 0
n = 0
while (i < 5) {
i++
   if (i == 3)
      continue
   n += i
}

помеченный checkiandj, содержит оператор, помеченный


Оператор, помеченный checkiandj, содержит оператор, помеченный checkj. Если обнаружен continue, программа прерывает текущую итерацию checkj и начинает следующую. Каждый раз при обнаружении continue оператор checkj реитерирует, пока его условие не возвратит false. Если возвращено false, выполняется остаток оператора checkiandj и checkiandj реитерирует, пока его условие не возвратит false. Если возвращено false, программа продолжает выполнение с оператора, идущего после checkiandj.
Если continue имеет метку checkiandj, программа продолжит выполнение от верха оператора checkiandj.
checkiandj :
   while (i<4) {
      document.write(i + "<BR>");
      i+=1;
      checkj :
         while (j>4) {
            document.write(j + "<BR>");
            j-=1;
            if ((j%2)==0);
               continue checkj;
            document.write(j + " is odd.<BR>");
         }
      document.write("i = " + i + "<br>");
      document.write("j = " + j + "<br>");
   }

Бесконечный цикл.


Проверяйте, что условие в цикле рано или поздно станет false; иначе цикл никогда не закончится. Операторы следующего цикла while выполняются бесконечно, поскольку condition никогда не станет false:

while (true) {
alert("Hello, world") }



Условные Операторы


Условный оператор это набор команд, выполняемый, если специфицированное true. JavaScript поддерживает два условных оператора : if...else и switch.



Функции Number и String



Функции Number и String

Функции Number и String позволяют конвертировать объект в число или строку. Синтаксис таков:

Number(objRef)
String(objRef)

где objRef это ссылка на объект.

В следующем примере Date-объект конвертируется в читабельную строку.

D = new Date (430054663215)
// возвращает
// "Thu Aug 18 04:37:43 GMT-0700 (Pacific Daylight Time) 1983"
x = String(D)



Функции parseInt и parseFloat


Функции parseInt и parseFloat

Две "parse"-функции, parseInt и parseFloat, возвращают числовое значение при получении строкового аргумента.

Синтаксис parseFloat таков:

parseFloat(str)

где parseFloat разбирает свой аргумент, строку str, и пытается возвратить число с плавающей точкой. Если она обнаруживает символ, отличный от знака (+ или -), числа (0-9), десятичной точки или экспоненты, она возвращает значение, разобранное до этого места, и игнорирует этот символ и все последующие символы. Если первый символ не может быть конвертирован в число, функция возвращает значение "NaN" (не-число).

Синтаксис parseInt таков:

parseInt(str [, radix])

parseInt разбирает первый аргумент, строку str, и пытается возвратить целое число со специфицированной radix (базой), обозначаемой вторым не обязательным аргументом radix. Например, radix 10 указывает на конвертацию десятеричного числа, 8 -восьмеричного, 16 - шестнадцатеричного, и так далее. При radix более 10 буквы латинского алфавита используются для обозначения цифр больше 9. Например, для 16-ричных чисел (база 16), используются английские буквы от A до F.

Если parseInt обнаруживает символ, не являющийся цифрой в специфицированном radix, она игнорирует этот и все последующие символы и возвращает целочисленное значение, разобранное до этого места. Если первый символ не может быть конвертирован в число со специфицированной базой, функция возвращает "NaN." Функция parseInt усекает строку до целочисленных значений.



Функция eval



Функция eval

Функция eval вычисляет строку кода JavaScript без ссылки на определённый объект. Синтаксис eval таков:

eval(expr)

где expr это вычисляемая строка.

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



Функция isFinite



Функция isFinite

Функция isFinite вычисляет аргумент, чтобы определить, является ли он конечным числом. Синтаксис isFinite:

isFinite(number)

где number это вычисляемое число.

Если аргумент имеет значения NaN, положительная или отрицательная бесконечность, то этот метод возвращает false, иначе возвращает true.

Следующий код проверяет клиентский ввод и определяет, является ли он конечным числом.

if(isFinite(ClientInput) == true)
{
/* некоторые специальные шаги */
}



Функция isNaN


Функция isNaN

Функция isNaN вычисляет аргумент, чтобы определить, является ли он "NaN" (не-числом). Синтаксис isNaN:

isNaN(testValue)

где testValue это значение, которое Вы хотите обсчитать.

Функции parseFloat и parseInt возвращают "NaN", если они вычисляют значение, которое не является числом. isNaN возвращает true, если передано "NaN", и false - в ином случае.

Следующий код вычисляет floatValue и определяет, является ли оно числом, а затем вызывает соответствующую процедуру:

floatValue=parseFloat(toFloat)

if (isNaN(floatValue)) {
   notFloat()
} else {

   isFloat()
}



Функции



Глава 6
Функции

Функции это фундаментальные конструкции JavaScript. Функция это процедура JavaScript - набор операторов, выполняющих специфическую задачу. Для использования функции Вы обязаны сначала определить её; затем Ваш скрипт может её вызвать.

В главе имеются следующие разделы:

Определение функций

Вызов функций

Использование массива arguments

Предопределённые функции



Использование массива arguments


Аргументы обрабатываются в массиве. В функции Вы можете адресовать параметры, передаваемые ей:

arguments[i]
functionName.arguments[i]

где i это порядковый номер аргумента, начиная с 0. Таким образом, первый аргумент, передаваемый функции, это arguments[0]. Общее число аргументов указывается свойством arguments.length.

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

Например, рассмотрим функцию, которая объединяет несколько строк. Единственным формальным аргументом для этой функции является строка, которая специфицирует символы, разделяющие объединяемые элементы. Функция определена так:

function myConcat(separator) {
result="" // инициализирует список

   // итерирует по аргументам
   for (var i=1; i<arguments.length; i++) {

      result += arguments[i] + separator
   }

   return result
}

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

// возвращает "red, orange, blue, "
myConcat(", ","red","orange","blue")

// возвращает "elephant; giraffe; lion; cheetah;"

myConcat("; ","elephant","giraffe","lion", "cheetah")

// возвращает "sage. basil. oregano. pepper. parsley. "
myConcat(". ","sage","basil","oregano", "pepper", "parsley")

См. статью об объекте Function в книге

Клиентский JavaScript. Справочник.



Определение функций


Определение функции состоит из ключевого слова function и:

имени функции

списка аргументов, заключённых в скобки и разделённых запятыми

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

Вы должны определять все Ваши функции в HEAD/шапке страницы, чтобы при её загрузке пользователем функции загружались в первую очередь. Иначе пользователь может выполнить действие, когда страница ещё загружается, и включить обработчик и вызвать функцию, которая ещё не определена, что приведёт к возникновению ошибки.

Например, следующий код определяет простую функцию square:

function square(number) {
return number * number;
}

Функция square принимает один аргумент number. Эта функция состоит из одного оператора, указывающего возвращаемое значение - аргумент функции, умноженный сам на себя. Оператор return специфицирует значение, возвращаемое функцией.

return number * number

Все параметры передаются функциям по значению; значение передаётся функции, но если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаёте функции объект в качестве параметра и функция изменяет свойства объекта, это изменение видно&#x0301; вне функции, как показано в примере:

function myFunc(theObject) {
   theObject.make="Toyota"
}


mycar = {make:"Honda", model:"Accord", year:1998}
x=mycar.make     // возвращает Honda
myFunc(mycar)    // передаёт объект mycar функции
y=mycar.make     // возвращает Toyota (prop было изменено функцией)

Помимо описанного здесь определения функции, Вы можете также определять объекты Function, как показано в разделе "Объект Function".

Метод это функция, ассоциированная с объектом. Вы может узнать больше об объектах и методах в Главе 7 "Работа с Объектами".



Предопределённые функции


В JavaScript есть несколько предопределённых функций:

eval

isFinite

isNaN

parseInt и parseFloat

Number и String

escape и unescape

В следующих разделах рассматриваются эти функции. См. также книгу

Клиентский JavaScript. Справочник.



Вызов функций


В приложениях для Navigator'а Вы можете использовать (или вызывать) любую функцию, определённую на текущей странице. Вы можете также использовать функции, определённые другими именованными окнами или фрэймами.

Определение функции не вызывает её выполнения. Определение функции просто именует функцию и специфицирует, что&#x0301; выполняется при вызове функции. Вызов функции реально выполняет специфицированные акции с указанными параметрами. Например, если Вы определили функцию square, Вы можете вызвать её так:

square(5)

Это оператор вызова функции с аргументом 5. Функция выполняет свои операторы и возвращает значение 25.

Аргументы функции не ограничиваются только числами и строками. Вы можете также передавать в функцию объекты. Функция show_props (определённая в разделе "Объекты и Свойства") это пример функции, принимающей в качестве аргумента объект.

Функция может быть рекурсивной, то есть вызывать сама себя. Например, вот функция вычисления факториалов:

function factorial(n) {
   if ((n == 0) || (n == 1))

      return 1
   else {

      result = (n * factorial(n-1) )
   return result

   }
}

Вы можете вычислить факториалы значений от 1 до 5:

a=factorial(1) // возвращает 1
b=factorial(2) // возвращает 2
c=factorial(3) // возвращает 6
d=factorial(4) // возвращает 24
e=factorial(5) // возвращает 120



Двухмерные массивы



Двухмерные массивы

Следующий код создаёт двухмерный массив:

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]



Работа с Объектами



Глава 7
Работа с Объектами

JavaScript разработан на основе простой объектной парадигмы. Объект это конструкция со свойствами, которые являются переменными JavaScript или другими объектами. Объект также может иметь ассоциированные с ним функции, которые известны как methods\методы объекта. Помимо предопределённых серверных и клиентских объектов Navigator'а, можно создавать пользовательские объекты.

В главе рассматривается, как использовать объекты, свойства, функции и методы и как создавать Ваши собственные объекты.

В главе имеются следующие разделы:

Объекты и свойства

Создание новых объектов

Предопределённые объекты ядра



Индексирование свойств объекта



Индексирование свойств объекта

В JavaScript 1.0 Вы можете обратиться к свойствам объекта по имени или по индексу. В JavaScript 1.1 или позднее, однако, если Вы первоначально определили свойство по имени, Вы обязаны всегда обращаться к нему по имени и, если Вы первоначально определили свойство по индексу, Вы обязаны всегда обращаться к нему по индексу.

Это применяется при создании объекта и его свойств функцией-конструктором, как в предыдущем примере с типом объектов сar, и при определении индивидуальных свойств явным образом (например, myCar.color = "red"). Так, если Вы определяет первоначально свойства объекта индексированием, как myCar[5] = "25 mpg", Вы в дальнейшем обращаетесь к свойству myCar[5].

Исключением из этого правила является объект, отражённый из HTML, такой как массив forms. Вы можете всегда обратиться к объектам в этих массивах по порядковому номеру (в зависимости от места в документе) или по именам (если определены). Например, если второй тэг <FORM> в документе имеет в атрибуте NAME значение "myForm", Вы можете обратиться к форме document.forms[1] or document.forms["myForm"] или document.myForm.



Использование функции-конструктора



Использование функции-конструктора

Альтернативно можно создавать объект в два этапа:

Определить тип объекта, написав функцию-конструктор.

Создать экземпляр объекта с помощью операции new.

Для того чтобы определить тип объекта, создайте функцию для типа объекта, которая специфицирует имя, свойства и методы. Например, Вы хотите создать тип объекта для автомобилей/cars. Вы называете тип объекта car и хотите, чтобы у него были свойства make, model, year и color. Для реализации этого Вы должны написать следующую функцию:

function car(make, model, year) {
   this.make = make
   this.model = model
   this.year = year
}

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

Теперь Вы можете создать объект mycar:

mycar = new car("Eagle", "Talon TSi", 1993)

Этот оператор создаёт объект mycar и присваивает специфицированные значения его свойствам. Тогда значением mycar.make будет строка "Eagle", mycar.year это целое число 1993 и так далее.

Вы можете создать любое количество объектов car через вызов new. Например,

kenscar = new car("Nissan", "300ZX", 1992)
vpgscar = new car("Mazda", "Miata", 1990)

Объект может иметь свойство, которое само является объектом. Например, Вы определяете объект person:

function person(name, age, sex) {
   this.name = name
   this.age = age
   this.sex = sex
}

и инстанциируете два новых person-объекта:

rand = new person("Rand McKinnon", 33, "M")
ken = new person("Ken Jones", 39, "M")

Затем Вы можете переписать определение car и включить в него свойство owner, которое принимает person-объект:

function car(make, model, year, owner) {
   this.make = make
   this.model = model
   this.year = year
   this.owner = owner
}

Теперь можно инстанциировать новые объекты:

car1 = new car("Eagle", "Talon TSi", 1993, rand)
car2 = new car("Nissan", "300ZX", 1992, ken)

Обратите внимание, что вместо передачи литеральной строки или целочисленного значения при создании новых объектов, эти операторы передают объекты rand и ken как аргументы для owner. Затем, если Вы хотите вычислить имя владельца автомобиля car2, Вы можете получить доступ к следующему свойству:

car2.owner.name

Заметьте, что Вы всегда можете добавить свойство к ранее определённому объекту. Например, оператор

car1.color = "black"

добавляет свойство color объекту car1 и присваивает ему значение "black." Однако это не влияет на все другие объекты. Для добавления свойства всем объектам данного типа Вы должны добавить свойство в определение типа объекта car.



Использование инициализаторов объектов



Использование инициализаторов объектов

Помимо создания объектов с использованием функции-конструктора, Вы можете создавать объекты с использованием инициализатора объекта. Использование инициализаторов объектов иногда называют созданием объектов с помощью литеральной нотации. "Инициализатор объекта" составлен в терминологии C++.

Синтаксис объекта, использующего инициализатор объекта, таков:

objectName = {property1:value1, property2:value2,..., propertyN:valueN}

где objectName это имя нового объекта, каждое propertyI это идентификатор (имя, число или строковой литерал), а каждое valueI  это выражение, значение которого присваивается свойству propertyI.

objectName и присвоение не обязательны. Если Вам не нужно ссылаться на данный объект, Вы можете не присваивать его переменной.

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

Этот оператор создаёт объект и присваивает его переменной x, если, и только если, выражение cond - true.

if (cond) x = {hi:"there"}

Следующий пример создаёт myHonda с тремя свойствами. Заметьте, что свойство engine является также объектом со своими собственными свойствами.

myHonda = {color:"red",wheels:4,engine:{cylinders:4,size:2.2}}

Вы можете также использовать инициализаторы объектов для создания массивов. См. "Литералы Массива".

JavaScript 1.1 и предыдущие версии.

Вы не можете использовать инициализаторы объектов. Вы можете создавать объекты только путём использования функций-конструкторов или функцией, предоставляемой другим объектом для этой цели. См. "Использование Функции-Конструктора".



Использование объекта Date: пример


Использование объекта Date: пример

В следующем примере функция JSClock() возвращает время в формате цифровых часов.

function JSClock() {
   var time = new Date()
   var hour = time.getHours()
   var minute = time.getMinutes()
   var second = time.getSeconds()
   var temp = "" + ((hour > 12) ? hour - 12 : hour)
   temp += ((minute < 10) ? ":0" : ":") + minute
   temp += ((second < 10) ? ":0" : ":") + second
   temp += (hour >= 12) ? " P.M." : " A.M."
   return temp
}

Функция JSClock сначала создаёт новый Date-объект time; поскольку аргументы не заданы, объект создаётся с текущей датой и временем. Затем методы getHours, getMinutes и getSeconds присваивают значения текущих часа, минут и секунд переменным hour, minute и second.

Следующие четыре оператора строят строковое значение на основе этого времени.

Первый оператор создаёт переменную temp, присваивая ей значение условного выражения; если hour больше 12, (hour - 13), иначе просто hour.

Следующий оператор присоединяет значение minute к temp. Если значение minute меньше 10, условное выражение прибавляет строку с предшествующим 0; иначе добавляет строку с разделяющим двоеточием. Затем оператор присоединяет значение секунд к temp тем же способом.

Наконец, условное выражение присоединяет "PM" к temp, если hour равно или больше 12; иначе присоединяет "AM" к temp.



Использование this для ссылок на объект


Использование this для ссылок на объект

В JavaScript имеется специальное слово this, которое можно использовать в методе для обращения к текущему объекту. Например, у Вас имеются: функция validate для проверки свойства value объекта, объект и значения high и low:

function validate(obj, lowval, hival) {
if ((obj.value < lowval) || (obj.value > hival))
      alert("Invalid Value!")
}

Затем Вы можете вызывать validate в обработчике события onChange каждого элемента формы, используя this для передачи ему элемента формы, как в следующем примере:

<INPUT TYPE="text" NAME="age" SIZE=3
   onChange="validate(this, 18, 99)">

В общем случае, this ссылается в методе на вызывающий объект.

При сочетании со свойством 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>



Массивы и регулярные выражения



Массивы и регулярные выражения

Если массив является результатом совпадения регулярного выражения и строки , этот массив возвращает свойства и элементы, которые предоставляют информацию о совпадении. Массив является тогда return-значением regexp.exec, string.match и string.replace. Об использовании массивов с регулярными выражениями см. Главу 4 "Регулярные Выражения".



Методы объекта Array


Методы объекта Array

Объект Array имеет следующие методы:

concat объединяет два массива и возвращает новый массив.join      объединяет все элементы массива в строку.

pop              удаляет последний элемент массива и возвращает этот элемент.

push            добавляет один или более элементов в конец массива и возвращает этот добавленный элемент.

reverse      разворачивает элементы массива: первый элемент становится последним, а последний - первым.

shift          удаляет первый элемент массива и возвращает этот элемент.

slice          извлекает раздел массива возвращает новый массив.

splice        добавляет и/или удаляет элементы массива.

sort            сортирует элементы массива.

unshift      прибавляет один или более элементов в начало массива и возвращает новый размер массива.

Например, Вы определили массив:

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".



Методы объекта Date



Методы объекта Date

Методы объекта Date для работы с датами и временем распадаются на следующие обширные категории:

"set"-методы для установки значений объектов Date.

"get"-методы для получения значений даты и времени из объектов Date.

"to"-методы для возвращения строковых значений из объектов Date.

parse и UTC-методы для разбора Date-строк.

Методами "get" и "set" Вы можете получать и устанавливать значения для секунд, минут, часа, дня недели, числа месяца, месяца и года. Имеется метод getDay, который возвращает день недели, но нет па&#x0301;рного метода setDay, поскольку день недели устанавливается автоматически. Эти методы используют целые числа для представления этих значений:

Секунды и минуты: от 0 до 59

Час: от 0 до 23

День недели: от 0 (Sunday) до 6 (Saturday)

Число месяца: от 1 до 31

Месяц: от 0 (January) до 11 (December)

Год: годы после 1900

Например, Вы определили дату:

Xmas95 = new Date("December 25, 1995")

Тогда Xmas95.getMonth() возвращает 11, а Xmas95.getFullYear() возвращает 95.

Методы getTime и setTime используются для сравнения дат. Метод getTime возвращает количество миллисекунд, прошедших после January 1, 1970, 00:00:00 для Date-объекта.

Например, следующий код выводит количество дней оставшихся в текущем году:

today = new Date()
endYear = new Date(1995,11,31,23,59,59,999) // устанавливает день и месяц
endYear.setFullYear(today.getFullYear()) // устанавливает в year текущий год
msPerDay = 24 * 60 * 60 * 1000 // количество миллисекунд в сутках
daysLeft = (endYear.getTime() - today.getTime()) / msPerDay
daysLeft = Math.round(daysLeft) //возвращает количество оставшихся в году дней

Этот пример создаёт Date-объект today, который содержит текущую дату. Затем создаётся Date-объект endYear в него устанавливается значение текущего года. Далее, с использованием количества миллисекунд в сутки, вычисляется количество дней между текущей датой и endYear, с использованием getTime, которое затем округляется до целого количества суток.

Метод parse используется для присвоения значений из строк с датой существующим Date-объектам. Например, следующий код использует parse и setTime для присвоения значения даты объекту IPOdate:

IPOdate = new Date()
IPOdate.setTime(Date.parse("Aug 9, 1995"))



Наполнение массива


Наполнение массива

Вы можете наполнить массив, присвоив значения его элементам. Например,

emp[1] = "Casey Jones"
emp[2] = "Phil Lesh"
emp[3] = "August West"

Вы может наполнить массив также при его создании:

myArray = new Array("Hello", myVar, 3.14159)



Объект Array


Объект Array

В JavaScript нет типа данных array (массив). Однако Вы может использовать предопределённый объект Array и его методы для работы с массивами в Ваших приложениях. Объект Array имеет методы для работы с массивами: объединения, разворачивания и сортировки. Он имеет свойство для определения размера массива и другие свойства для использования с регулярными выражениями.

Массив это упорядоченный набор значений, к которым Вы обращаетесь по индексу или по имени. Например, у Вас имеется массив emp, в котором содержатся имена служащих, индексированные числом. Так, emp[1] это служащий номер 1, emp[2] - служащий номер 2 и так далее.



Объект Boolean



Объект Boolean

Объект Boolean является оболочкой вокруг примитивного типа данных Boolean. Используйте следующий синтаксис для создания Boolean-объекта:

booleanObjectName = new Boolean(value)

Не путайте примитивные Boolean-значения true и false со значениями true и false объекта Boolean. Любой объект, значение которого не undefined или null, и не объект Boolean со значением false, вычисляется в true, когда передаётся в условный оператор. См. "Оператор if...else".



Объект Date


Объект Date

В JavaScript нет типа данных data. Однако можно использовать объект Date и его методы для работы с датами и временем. Объект Date имеет большое количество методов для установки, получения и обслуживания дат.
Он не имеет свойств.

JavaScript обрабатывает даты аналогично Java. Эти два языка имеют много одинаковых методов для дат и хранят даты как количество миллисекунд относительно 1 января 1970 года, 00:00:00.

Диапазон объекта Date от -100,000,000 до 100,000,000 дней относительно 01 January, 1970 UTC.

Для создания Date-объекта:

dateObjectName = new Date([parameters])

где dateObjectName это имя создаваемого Date-объект; это может быть новый объект или свойство существующего объекта.

Значение parameters может быть одним из:

Ничем: создаётся текущая дата и время. Например, today = new Date().

Строкой, представляющей дату в следующей форме: "Month day, year hours:minutes:seconds".

Например, Xmas95 = new Date("December 25, 1995 13:30:00").

Если Вы опустите hours, minutes или seconds, значение будет установлено в 0.

Набором целочисленных значений для year, month и day. Например, Xmas95 = new Date(1995,11,25).

Набором целочисленных значений для year, month, day, hour, minute и seconds. Например, Xmas95 = new Date(1995,11,25,9,30,0).

JavaScript 1.2 и предыдущие версии.

Объект Date работает так:

Даты до 1970 не допускаются.

JavaScript зависит от платформы, на которой используется; поведение объекта Date варьируется от платформы к платформе.



Объект Function


Объект Function

Предопределённый объект Function специфицирует строку кода JavaScript, компилируемую как функция.

Для создания Function-объекта:

functionObjectName = new Function ([arg1, arg2, ... argn], functionBody)

functionObjectName это имя переменной или свойства существующего объекта. Это может быть также объект с последующим именем обработчика события в нижнем регистре, например, window.onerror.

arg1, arg2, ... argn это аргументы, используемые функцией как имена формальных аргументов. Каждое обязано быть строкой, соответствующей верному идентификатору JavaScript; например "x" или "theForm".

functionBody это строка, специфицирующая код JavaScript, компилируемый как тело функции.

Function-объекты вычисляются при каждом использовании. Это менее эффективно, чем объявление функции и вызов её в коде, поскольку объявленная функция компилируется.

Помимо рассмотренного здесь объявления, Вы можете также использовать оператор function. См. книгу Клиентский JavaScript. Справочник.

Следующий код присваивает функцию переменной setBGColor. Эта функция устанавливает цвет фона текущего документа.

var setBGColor = new Function("document.bgColor='antiquewhite'")

Для вызова Function-объекта Вы можете специфицировать имя переменной, как если бы это была функция. Следующий код выполняет функцию, специфицированную переменной setBGColor:

var colorChoice="antiquewhite"
if (colorChoice=="antiquewhite") {setBGColor()}

Вы можете присвоить функцию обработчику события одним из следующих способов:

1. document.form1.colorButton.onclick=setBGColor2. <INPUT NAME="colorButton" TYPE="button"
VALUE="Change background color"
      onClick="setBGColor()">

Создание переменной setBGColor, показанное выше, похоже на объявление следующей функции:

function setBGColor() {
   document.bgColor='antiquewhite'
}

Вы можете вкладывать функцию в функцию. Вложенная (внутренняя) функция является private для её содержащей (внешней) функции:

Внутренняя функция доступна только для операторов внешней функции.

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



Объект Math


Объект Math

Предопределённый объект Math имеет свойства и методы для математических констант и функций. Например, свойство PI имеет значение pi (3.141...), которое Вы можете использовать в приложениях так:

Math.PI

Также и стандартные математические функции являются методами объекта Math. Сюда входят тригонометрические, логарифмические, экспоненциальные и др. функции. Например, если Вы хотите использовать тригонометрическую функцию sine/синус, Вы может записать:

Math.sin(1.56)

Учтите, что все тригонометрические методы объекта Math принимают объекты в радианах.

В таблице дано резюме по методам объекта Math.



Объект Number



Объект Number

Объект Number имеет свойства для числовых констант, таких как максимальное значение, не-число и бесконечность. Вы не можете изменять эти значения и используете их так:

biggestNum = Number.MAX_VALUE
smallestNum = Number.MIN_VALUE
infiniteNum = Number.POSITIVE_INFINITY
negInfiniteNum = Number.NEGATIVE_INFINITY
notANum = Number.NaN

Вы всегда обращаетесь к свойствам предопределённого объекта Number так, как показано выше, а не как к свойствам Number-объекта, созданного Вами.

В таблице дано резюме по свойствам объекта Number.



Объект RegExp



Объект RegExp

Объект RegExp даёт возможность работать с регулярными выражениями. Он рассмотрен в Главе 4 "Регулярные Выражения".



Объект String


Объект String

Объект String является оболочкой для примитивного типа данных string. Не путайте строковой литерал с объектом String. Например, следующий код создаёт строковой литерал s1 и String-объект s2:

s1 = "foo" //создаёт строковое литеральное значение
s2 = new String("foo") //создаёт String-объект

Вы можете вызывать любой из методов объекта String в строковом литеральном значении - JavaScript автоматически конвертирует строковой литерал во временный String-объект, вызывает метод, затем уничтожает временный String-объект. Вы можете также использовать свойство String.length со строковым литералом.

Вы должны использовать строковые литералы, если только Вам не нужно обязательно использовать объект String, поскольку String-объекты могут иметь непредсказуемое поведение. Например:

s1 = "2 + 2" //создаёт строковое литеральное значение
s2 = new String("2 + 2")//создаёт String-объект
eval(s1) //возвращает число 4
eval(s2) //возвращает строку "2 + 2"

Объект String имеет одно свойство, length, которое обозначает количество символов в строке. Например, следующий код присваивает переменной x значение 13, поскольку "Hello, World!" состоит из 13 символов:

myString = "Hello, World!"
x = mystring.length

Объект String имеет методы двух типов: возвращающие вариации самой строки, такие как substring и toUpperCase, и возвращающие HTML-форматированную версию строки, такие как bold и link.

Например, используя предыдущий пример, и mystring.toUpperCase() и "hello, world!".toUpperCase() возвратят строку "HELLO, WORLD!".

Метод substring принимает два аргумента и возвращает подстроку между двумя аргументами. Используя предыдущий пример, mystring.substring(4, 9) возвращает строку "o, Wo." См. метод substring объекта String в книге

Клиентский JavaScript. Справочник.

Объект String также имеет несколько методов для автоматического HTML-форматирования, такие как bold для создания жирного начертания текста и link для создания гиперссылки. Например, Вы можете создать гиперссылку на воображаемый URL методом link:

mystring.link("http://www.helloworld.com")

В таблице дано резюме по методам объекта String.



Объекты и свойства


Объект в JavaScript имеет ассоциированные с ним свойства. Вы получаете доступ к этим свойствам объектов с помощью простой нотации:

objectName.propertyName

И имя объекта, и имя свойства чувствительны к регистру символов. Вы определяете свойство, присваивая ему значение. Например, имеется объект myCar (для упрощения будем всё время предполагать, что объект уже существует). Вы можете создать его свойства make, model и year:

myCar.make = "Ford"
myCar.model = "Mustang"
myCar.year = 1969;

Массив это упорядоченный набор значений, ассоциированных с одним именем переменной. Свойства и массивы в JavaScript тесно связаны; фактически это два разных интерфейса для одной структуры данных. Так, например, Вы можете получить доступ к свойствам объекта myCar так:

myCar["make"] = "Ford"
myCar["model"] = "Mustang"
myCar["year"] = 1967

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

function show_props(obj, obj_name) {
var result = ""
   for (var i in obj)
      result += obj_name + "." + i + " = " + obj[i] + "\n"
   return result
}

Так, вызов функции show_props(myCar, "myCar") возвратит:

myCar.make = Ford
myCar.model = Mustang
myCar.year = 1967



Обращение к элементам массива


Обращение к элементам массива

Вы обращаетесь к элементам массива по порядковому номеру элемента. Например, Вы определили следующий массив:

myArray = new Array("Wind","Rain","Fire")

Затем Вы обращаетесь к первому элементу массива myArray[0], а ко второму элементу - myArray[1].

Индексы массива начинаются от 0, но размер массива (например, myArray.length) отражает реальное количество элементов массива.



Определение методов



Определение методов

Метод это функция, ассоциированная с объектом. Вы определяете метод так же, как и стандартную функцию. Затем Вы используете для ассоциирования функции с существующим объектом следующий синтаксис:

object.methodname = function_name

где object это существующий объект, methodname это имя, присвоенное Вами методу, а function_name это имя функции.

Вы можете затем вызвать метод в контексте объекта:

object.methodname(params);

Вы можете определить методы для типа объектов, включив определение метода в функцию-конструктор. Например, Вы могли бы определить функцию форматирования и отображения свойств ранее определённых объектов car; например,

function displayCar() {
var result = "A Beautiful " + this.year + " " + this.make
      + " " + this.model
   pretty_print(result)
}

где pretty_print это функция для отображения горизонтальной линии и строки. Обратите внимание на использование this для обращения к объекту, которому принадлежит данный метод.

Вы можете сделать эту функцию методом объектов типа car, добавив оператор

this.displayCar = displayCar;

к определению типа объектов. Так, полное определение car теперь будет выглядеть:

function car(make, model, year, owner) {
   this.make = make
   this.model = model
   this.year = year
   this.owner = owner
   this.displayCar = displayCar
}

Затем можно вызвать метод displayCar для каждого объекта:

car1.displayCar()
car2.displayCar()

Это даст вывод показанный на рисунке.



Определение свойств для типа объектов



Определение свойств для типа объектов

Вы можете добавить свойство к ранее определённому типу объектов, используя свойство prototype. Оно определяет свойство, которое используется всеми объектами специфицированного типа, а не только одним экземпляром объекта. Следующий код добавляет свойство color всем объектам типа car и присваивает значение свойства color объекту car1.

Car.prototype.color=null
car1.color="black"

См. свойство prototype объекта Function в книге

Клиентский JavaScript. Справочник.



Предопределённые объекты ядра


В этом разделе рассматриваются предопределённые объекты ядра JavaScript: Array, Boolean, Date, Function, Math, Number, RegExp и String. Предопределённые клиентские объекты рассматриваются в

Главе 11, "Использование Объектов Navigator'а".



Создание массива


Создание массива

Создание Array-объекта:

1. arrayObjectName = new Array(element0, element1, ..., elementN)
2. arrayObjectName = new Array(arrayLength)

arrayObjectName это либо имя нового объекта, либо свойство существующего объекта. При использовании свойств и методов объекта Array, arrayObjectName это либо имя существующего Array-объекта, либо свойство существующего объекта.

element0, element1, ..., elementN это список значений для элементов массива. Если специфицирована эта форма, массив инициализируется специфицированными значениями в качестве его элементов, а в свойство length массива устанавливается количество аргументов.

arrayLength это начальный размер массива. Следующий код создаёт массив из 5 элементов:

billingMethod = new Array(5)

Литералы массива также являются Array-объектами; например, следующий литерал является Array-объектом.

coffees = ["French Roast", "Columbian", "Kona"]

См. также "Литералы Массива".



Создание новых объектов


В JavaScript имеются предопределённые объекты. Кроме того, Вы можете создавать Ваши собственные объекты. В JavaScript 1.2 Вы можете создавать объект с использованием инициализатора объекта. Альтернативно, Вы можете сначала создать функцию-конструктор, а затем инстанциировать объект с использованием этой функции и операции new.



Методы объекта Math



Таблица 7.1 Методы объекта Math

Метод

Описание

absАбсолютное значение
sin, cos, tanСтандартные тригонометрические функции; аргумент в радианах
acos, asin, atanИнверсные тригонометрические функции; return-значения в радианах
exp, logЭкспоненциальный и натуральный логарифмы, база e
ceilВозвращает наименьшее целое, больше и равное аргументу
floorВозвращает наибольшее целое, меньше и равное аргументу
min, maxВозвращается больший или меньший (соответственно) из двух аргументов
powПоказатель степени; первый аргумент - база, второй - экспонента
roundОкругляет аргумент до ближайшего целого
sqrtКвадратный корень

В отличие от многих других объектов, Вы никогда не создаёте собственные объекты Math. Вы всегда используете предопределённый объект Math.

Часто бывает удобнее использовать этот объект с оператором with, когда большой участок кода использует математические константы и методы, чтобы не нужно было постоянно печатать "Math". Например,

with (Math) {
a = PI * r*r
   y = r*sin(theta)
   x = r*cos(theta)
}



Свойства объекта Number



Таблица 7.2 Свойства объекта Number

Метод

Описание

MAX_VALUEНаибольшее представимое число
MIN_VALUEНаименьшее представимое число
NaNСпециальное значение "not a number/не число"
NEGATIVE_INFINITYСпециальное значение "бесконечность"; возвращается при переполнении
POSITIVE_INFINITYСпециальное значение "отрицательная бесконечность"; возвращается при переполнении



Удаление объектов



Удаление объектов

Вы можете удалить объект оператором delete. Следующий код показывает, как удалить объект.

myobj=new Number()
delete myobj   // удаляет объект и возвращает true

См. также "delete".

JavaScript 1.1. Вы можете удалить объект, установив ссылку на объекта в null (если это последняя ссылка на объект). JavaScript "финализирует" объект немедленно, как часть операции присвоения.

JavaScript 1.0.

Вы не можете удалять объекты - они существуют, пока Вы не выйдете со страницы.