Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Область итерации применяется для изменения значений переменных цикла, например, для уменьшения счетчика цикла.

Оператор for-in

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

for(переменная in объект)

{

. . .

строки тела цикла

. . .

}

Оператор while

Для организации циклов с проверкой условия их завершения перед выполнением итерации используется оператор while:

while(условие)

{

. . .

строки тела цикла

. . .

}

Если в результате оценки условия получается значение true, тогда итерация выполняется, если false - цикл прерывается.

Оператор break

С помощью оператора break можно прервать выполнение цикла, созданного операторами for или while, в любом месте. Например:

var i = 0;

while(true)

{

. . .

i++;

if(i > 10)

break;

. . .

}

Оператор continue

Выполнение оператора continue внутри цикла for или while приводит к тому, что итерация прерывается, а затем возобновляется заново. Этот оператор не прерывает цикл.

Ниже мы привели пример использования оператора continue:

var i = 0;

while(i < 100)

{

i++;

if(i < 10)

continue;

. . .

}

Здесь фрагмент тела цикла, отмеченный многоточием, будет выполняться только после того, как значение переменной i станет равным 10. Когда же это значение достигнет 100, цикл будет завершен.

Прочие операторы

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

Оператор

Описание

.

Доступ к полю объекта

[]

Индексирование массива

()

Скобки

,

Запятая

Первый из этих операторов применяется для вызова методов, определенных в объектах, а также для доступа к полям объектов или, как их еще называют, к свойствам объектов.

НЕ нашли? Не то? Что вы ищете?

Ниже, например, мы вызвали метод write, определенный в объекте document:

document. write("Hello, world!");

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

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

Оператор запятая предназначен для разделения выражений, которые должны оцениваться последовательно. Этот прием называется многократным вычислением. Например, в фрагменте исходного текста, показанном ниже, на каждой итерации цикла выполняется увеличение содержимого переменных i и nCycleCount:

var i;

var nCycleCount = 0;

for(i = 0; i < 25; i++, nCycleCount++)

{

. . .

}

Старшинство операторов JavaScript

Ниже мы привели таблицу старшинства операторов JavaScript. С помощью этой таблицы можно определить порядок вычисления составных операторов. При этом следует учитывать, что все логические операции выполняются слева направо.

Первыми вычисляются операторы, расположенные в начале таблицы старшинства:

Оператор

Описание

. [] ()

Доступ к полю, индексирование в массиве, вызов функции

++ -- - ~ !

Унарные операторы

* / %

Умножение, деление, вычисление остатка от деления

+ - +

Сложение, вычитание, слияние текстовых строк

<< >> >>>

Битовые сдвиги

< <= > >=

Меньше, меньше или равно, больше, больше или равно

== !=

Равенство, неравенство

&

Логическая операция И

^

Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ

|

Логическая операция ИЛИ

&&

Логический оператор отношения И

||

Логический оператор отношения ИЛИ

?:

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

= += -= *= /= %= >>= >>>= <<= |= &= ^=

Присваивание

,

Многократное вычисление

Функции в языке сценариев JavaScript

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

Обычно функции определяются в разделе заголовка документа HTML, отмеченного операторами <HEAD> и </HEAD>. Как мы уже говорили, функция должна быть определена перед вызовом. Размещение всех определений функций в разделе заголовка документа HTML гарантирует доступность этих функций при обработке документа.

Общий вид определения функции представлен ниже:

function имя([параметр 1] [,параметр 2] [...,параметр N])

{

. . .

строки тела функции

. . .

[return значение]

}

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

С помощью ключевого слова return функция может вернуть значение.

Примеры использования операторов цикла

Приведем три примера использования операторов цикла for и while.

Во всех этих примерах сценарий отображает в окне документа десять строк “Hello, world!”, как это показано на рис. 1.9.

Рис. 1.9. Сценарий отображает в документе HTML десять одинаковых строк

Исходный текст первого сценария представлен в листинге 1.10.

Листинг 1.10. Файл chapter1/Operators/for. html

<HTML>

<HEAD>

<TITLE>Hello, world!</TITLE>

<SCRIPT LANGUAGE="JavaScript">

<!--

var n = 10;

var szHelloMsg = "Hello, world!";

function printNString(szString, n)

{

var i;

for(i = 0; i < n; i++)

{

document. write(szString. bold() + "<BR>");

}

}

function printHello()

{

printNString(szHelloMsg, 10);

}

// -->

</SCRIPT>

</HEAD>

<BODY BGCOLOR=white>

<H1>JavaScript Test</H1>

<P>Message:<BR>

<SCRIPT LANGUAGE="JavaScript">

<!--

printHello();

// -->

</SCRIPT> </BODY>

</HTML>

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

printNString(szHelloMsg, 10);

Через первый параметр этой функции мы передаем текстовую строку szHelloMsg, а через второй - количество повторов этой строки при выводе.

Вывод строки выполняется функцией printNString в цикле:

for(i = 0; i < n; i++)

{

document. write(szString. bold() + "<BR>");

}

Здесь значение переменной цикла i изменяется от нуля до n, где n - количество повторов. Когда значение переменной цикла достигнет значения n, цикл будет завершен.

В листинге 1.11 показан сценарий, решающий ту же самую задачу другим методом - с использованием оператора while.

Листинг 1.11. Файл chapter1/Operators/while. html

<HTML>

<HEAD>

<TITLE>Hello, world!</TITLE>

<SCRIPT LANGUAGE="JavaScript">

<!--

var n = 10;

var szHelloMsg = "Hello, world!";

function printNString(szString, n)

{

var i;

i = 0;

while(i < n)

{

document. write(szString. bold() + "<BR>");

i++;

}

}

function printHello()

{

printNString(szHelloMsg, 10);

}

// -->

</SCRIPT>

</HEAD>

<BODY BGCOLOR=white>

<H1>JavaScript Test</H1>

<P>Message:<BR>

<SCRIPT LANGUAGE="JavaScript">

<!--

printHello();

// -->

</SCRIPT> </BODY>

</HTML>

Здесь i также используется как переменная цикла:

i = 0;

while(i < n)

{

document. write(szString. bold() + "<BR>");

i++;

}

Как работает этот цикл?

После вывода строки методом write значение переменной цикла увеличивается на единицу. Затем перед началом следующей итерации проверяется, достигла ли переменная цикла значения n. Если достигла, цикл завершает свою работу.

Совместное применение операторов while и break демонстрируется в сценарии, показанном в листинге 1.12.

Листинг 1.12. Файл chapter1/Operators/break. html

<HTML>

<HEAD>

<TITLE>Hello, world!</TITLE>

<SCRIPT LANGUAGE="JavaScript">

<!--

var n = 10;

var szHelloMsg = "Hello, world!";

function printNString(szString, n)

{

var i;

i = 0;

while(true)

{

document. write(szString. bold() + "<BR>");

i++;

if(i > n)

break;

}

}

function printHello()

{

printNString(szHelloMsg, 10);

}

// -->

</SCRIPT>

</HEAD>

<BODY BGCOLOR=white>

<H1>JavaScript Test</H1>

<P>Message:<BR>

<SCRIPT LANGUAGE="JavaScript">

<!--

printHello();

// -->

</SCRIPT> </BODY>

</HTML>

Так же как и в предыдущем случае, i используется как переменная цикла, однако в операторе while на месте условия завершения цикла стоит значение true:

i = 0;

while(true)

{

document. write(szString. bold() + "<BR>");

i++;

if(i > n)

break;

}

Для того чтобы прервать цикл, мы применили оператор break. Этот оператор вызывается в том случае, если значение переменной цикла i превысило значение n.

2 Классы и объекты в JavaScript

Язык сценариев JavaScript является объектно-ориентированным, подобно языку программирования С++, однако в реализации объектов между этими языками есть весьма существенные отличия.

Объекты JavaScript представляют собой наборы свойств и методов. Можно сказать, что свойства объектов - это данные, связанные с объектом, а методы - функции для обработки данных объекта. Те из вас, кто программировал на языке С++, могут провести аналогию с полями и методами, определенными в классе.

Адресация свойств в сценариях JavaScript возможна либо по именам свойств, либо по их номеру. Последнее возможно благодаря тому, что все свойства объекта хранятся как элементы массива и потому каждое свойство имеет свой номер.

Три типа объектов JavaScript

В языке JavaScript имеется три типа объектов: встроенные объекты, объекты браузера и объекты, которые программист создает самостоятельно (рис. 2.1).

Рис. 2.1. Объекты в сценариях JavaScript

Каждый из этих типов имеет свое назначение и свои особенности.

Встроенные объекты

Ниже мы перечислили встроенные объекты, свойства и методы которых доступны в сценариях JavaScript без предварительного определения этих объектов:

Объект

Описание

Array*

Массив

Boolean*

Логические данные

Date

Календарная дата

Function*

Функция

Global*

Глобальные методы

Math

Математические константы и функции

Number*

Числа

Object*

Объект

String

Строки

Здесь символом * отмечены встроенные объекты, определенные в языке Microsoft JScript версии 3.0. Эта версия реализована в браузере Microsoft Internet Explorer версии 4.0.

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

Как работать со встроенными объектами?

Достаточно просто. Программа создает реализации (instance) объектов, а затем обращается к свойствам и методам объектов.

В качестве примера, имеющего практическое значение, рассмотрим документ HTML, в котором отображается текущая дата и время. Исходный текст этого документа вы найдете в листинге 2.1.

Листинг 2.1. Файл chapter2/date/date. html

<HTML>

<HEAD>

<TITLE>Show date and time</TITLE>

</HEAD>

<BODY BGCOLOR=WHITE>

<H1>Show date and time</H1>

<SCRIPT LANGUAGE="JavaScript">

<!--

var dt;

var szDate="";

dt = new Date();

szDate = "Date: " + dt. getDate() + "."

+ dt. getMonth() + "." + dt. getYear();

document. write(szDate);

document. write("<BR>");

document. write("Time: " + dt. getHours()

+ ":" + dt. getMinutes() + ":" + dt. getSeconds());

// -->

</SCRIPT>

</BODY>

</HTML>

Здесь сценарий JavaScript создает объект Data, применяя для этого ключевое слово new, знакомое всем поклонникам языка С++, и конструктор Date без параметров:

var dt;

dt = new Date();

Создаваемый таким образом объект Data инициализируется текущей локальной датой, установленной у пользователя (а не на сервере Web, с которого был загружен соответствующий документ HTML).

В следующей строке формируется текстовая строка даты:

szDate = "Date: " + dt. getDate() + "."

+ dt. getMonth() + "." + dt. getYear();

Значение календарного числа, номера месяца и года здесь получается при помощи методов getDate, getMonth и getYear, соответственно. Эти методы вызываются для объекта dt, содержащего текущую дату.

Текстовая строка даты выводится в документ HTML с помощью метода write, определенного в объекте document:

document. write(szDate);

Этот способ мы уже использовали в примерах сценариев, приведенных в первой главе нашей книги.

Заметим, что объект Date содержит также информацию о текущем времени. Эта информация извлекается для отображения с помощью методов getHours, getMinutes и getSeconds (соответственно, часы, минуты и секунды):

document. write("Time: " + dt. getHours()

+ ":" + dt. getMinutes() + ":" + dt. getSeconds());

Внешний вид документа HTML при его просмотре в окне браузера Microsoft Internet Explorer версии 4.0 показан на рис. 2.2.

Рис. 2.2. Просмотр локальной даты и времени

Применение других встроенных объектов мы продемонстрируем позже по мере изучения материала.

Объекты браузера

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

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

Иерархия объектов браузера

Иерархия объектов браузера схематически показана на рис. 2.2.

Рис. 2.2. Иерархия объектов браузера

Объект window находится в корне иерархии. Когда в окно браузера загружается документ HTML, внутри этого объекта создаются другие объекты - document, parent, frame, location и top.

Если в окно браузера загружается документ HTML с фреймами, то для каждого фрейма создается отдельное окно, причем это окно создается как объект window.

Объект document содержит в себе другие объекты, состав которых полностью определяется документом HTML, загруженным в окно браузера. Это могут быть формы, ссылки на другие документы HTML или локальные ссылки внутри одного документа, объекты, определяющие адрес URL документа и так далее.

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

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

События, связанные с объектами

Сделаем еще одно очень важное замечание относительно объектов браузера.

С каждым таким объектом связывается определенный набор событий, обработка которых возможна в сценарии JavaScript.

Например, с объектом window связаны события onLoad и onUnload. Первое из этих событий возникает, когда браузер завершает загрузку окна и всех расположенных в нем фреймов (если эти фреймы определены в окне). Второе событие возникает, когда пользователь завершает работу с документом, закрывая окно браузера или переключаясь на другой документ.

Сценарий JavaScript может, например, при обработке события onLoad выводить для пользователя приветственное сообщение или запрашивать дополнительную информацию. При завершении работы с окном (когда возникает событие onUnload) сценарий может освобождать какие-либо ресурсы, связанные с этим окном, или выводить сообщение на экран монитора.

С другими объектами браузера также связаны события. Мы расскажем о них при описании этих объектов.

Объекты на базе классов, создаваемых программистом

Многочисленные книги для начинающих, посвященные языку программирования С++, предлагают представить себе класс как структуру данных, где помимо обычных полей определены функции-методы для работы с этими данными. Так вот, в языке JavaScript для создания собственных классов используется прямо противоположный метод.

Класс JavaScript создается как функция, в которой определены свойства, играющие роль данных. Что же касается методов, то они тоже определяются как функции, но отдельно.

Приведем конкретный пример.

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

Рис. 2.3. Просмотр содержимого записей

Прежде всего займемся созданием собственного класса с названием myRecord. Пусть пока в нем не будет методов, мы добавим их позже.

Искомый класс создается следующим образом:

function myRecord(name, family, phone, address)

{

this. name = name;

this. family = family;

this. phone = phone;

this. address = address;

this. secure = false;

}

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

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

Обратите внимание, что наш конструктор инициализирует свойство с именем secure, записывая в него значение false. Соответствующий параметр в конструкторе не предусмотрен, что вполне допустимо.

Как пользоваться определенным классом?

На базе этого класса вы можете создать произвольное количество объектов. Ниже мы привели фрагмент сценария JavaScript, где на базе класса myRecord создается два объекта rec1 и rec2:

var rec1;

var rec2;

rec1 = new myRecord("Иван", "Иванов",

"", "Малая Большая ул., ");

rec2 = new myRecord("Петр", "Петров",

"4", "Большая Малая ул., ");

rec2.secure = true;

Объекты создаются при помощи оператора new, знакомого тем, кто составлял программы на языках С++ и Java. Здесь мы передаем конструктору параметры для инициализации свойств создаваемых объектов.

Что же касается свойства с именем secure, то в объекте rec2 оно инициализируется уже после создания последнего. В него записывается значение true. Мы не изменяли свойство secure объекта rec1, поэтому в нем хранится значение false.

Теперь наша задача - добавление в определенный нами класс новых методов с именами printTableHead, printTableEnd и printRecord. Первые два из этих методов выводят в документ HTML, соответственно, начальный и конечный фрагмент таблицы, а третий - строки таблицы, отражающие содержимое записей.

В сокращенном виде новое определение класса myRecord представлено ниже:

function printTableHead()

{

. . .

}

function printTableEnd()

{

. . .

}

function printRecord()

{

. . .

}

function myRecord(name, family, phone, address)

{

this. name = name;

this. family = family;

this. phone = phone;

this. address = address;

this. secure = false;

this. printRecord = printRecord;

this. printTableHead = printTableHead;

this. printTableEnd = printTableEnd;

}

Здесь перед определением конструктора мы расположили определения для функций-методов нашего класса. Кроме этого, в конструктор добавлено определение новых свойств:

this. printRecord = printRecord;

this. printTableHead = printTableHead;

this. printTableEnd = printTableEnd;

Эти свойства хранят ссылки на методы, определенные выше.

После такого определения класса вы можете создавать объекты и обращаться к определенным методам:

rec1.printTableHead();

rec1.printRecord();

rec1.printTableEnd();

rec2.printTableHead();

rec2.printRecord();

rec2.printTableEnd();

Возвращаясь к документу, показанному выше на рис. 2.3, приведем его полный исходный текст (листинг 2.2).

Листинг 2.2. Файл chapter2/NewObject/NewObject. html

<HTML>

<HEAD>

<TITLE>Просмотр записей</TITLE>

<SCRIPT LANGUAGE="JavaScript">

<!--

function printTableHead()

{

var szSec = "";

if(this. secure)

szSec = " (Secure)";

else

szSec = " (Unsecure)".fontcolor("red");

document. write("<TABLE BORDER>");

document. write("<CAPTION ALIGN=LEFT>" +

this. name + " " + this. family + szSec +

"</CAPTION>");

document. write("<TH ALIGN=LEFT>Поле записи</TH>"

+ "<TH ALIGN=LEFT>Содержимое</TH>");

}

function printTableEnd()

{

document. write("</TABLE>");

document. write("<P> ");

}

function printRecord()

{

document. write("<TR><TD>Name:</TD><TD>" +

this. name. italics() + "</TD></TR>");

document. write("<TR><TD>Family:</TD><TD>" +

this. family. italics() + "</TD></TR>");

document. write("<TR><TD>Phone:</TD><TD>" +

this. phone. italics() + "</TD></TR>");

document. write("<TR><TD>Address:</TD><TD>" +

this. address. italics() + "</TD></TR>");

}

function myRecord(name, family, phone, address)

{

this. name = name;

this. family = family;

this. phone = phone;

this. address = address;

this. secure = false;

this. printRecord = printRecord;

this. printTableHead = printTableHead;

this. printTableEnd = printTableEnd;

}

// -->

</SCRIPT>

</HEAD>

<BODY BGCOLOR=WHITE>

<H1>Просмотр записей</H1>

<SCRIPT LANGUAGE="JavaScript">

<!--

var rec1;

var rec2;

rec1 = new myRecord("Иван", "Иванов",

"", "Малая Большая ул., ");

rec2 = new myRecord("Петр", "Петров",

"4", "Большая Малая ул., ");

rec2.secure = true;

rec1.printTableHead();

rec1.printRecord();

rec1.printTableEnd();

rec2.printTableHead();

rec2.printRecord();

rec2.printTableEnd();

// -->

</SCRIPT>

</BODY>

</HTML>

Определение нового класса myRecord и его методов мы расположили в области заголовка документа HTML, как это принято делать.

Метод printTableHead выводит в документ HTML заголовок таблицы. Внешний вид этого заголовка зависит от содержимого свойств объекта.

Прежде всего метод printTableHead проверяет свойство secure, получая его значение при помощи ключевого слова this:

var szSec = "";

if(this. secure)

szSec = " (Secure)";

else

szSec = " (Unsecure)".fontcolor("red");

Здесь это ключевое слово означает, что необходимо использовать свойство того объекта, для которого был вызван метод printTableHead.

Если содержимое свойства secure равно true, в текстовую переменную szSec записывается строка " (Secure)". Если же оно равно false, в эту переменную заносится строка " (Unsecure)", причем для строки устанавливается красный цвет.

Так как в JavaScript все текстовые строки (в том числе и литералы) являются объектами встроенного класса String, то для них можно вызывать определенные в этом классе методы. В частности, метод fontcolor позволяет установить цвет строки, чем мы и воспользовались.

Далее метод printTableHead выводит в документ HTML оператор <TABLE> с параметром BORDER, с которого начинается определение таблицы, имеющей рамку. Надпись над таблицей задается с помощью динамически формируемого оператора <CAPTION>. В эту надпись включается имя и фамилия, извлеченные из соответствующих свойств объекта, для которого был вызван метод printTableHead. Затем этот метод выводит надписи для столбцов таблицы.

Метод printTableEnd выводит в документ HTML оператор </TABLE>, завершающий определение таблицы, а также пустой параграф для отделения таблиц, следующих друг за другом:

function printTableEnd()

{

document. write("</TABLE>");

document. write("<P> ");

}

Последний метод, определенный в нашем классе, называется printRecord. Он печатает содержимое первых четырех свойств объекта как строку таблицы, определенной в документе HTML только что описанной функцией printTableHead.

Обратите внимание, что содержимое свойств объекта печатается наклонным шрифтом, для чего мы вызываем метод italics:

document. write("<TR><TD>Name:</TD><TD>" +

this. name. italics() + "</TD></TR>");

Определение класса myRecord мы уже описали выше.

Перейдем теперь ко второй части нашего сценария, расположенной в теле документа HTML.

Здесь мы создаем два объекта rec1 и rec2 на базе класса myRecord, а затем устанавливаем свойство secure объекта rec2 в состояние true.

Далее сценарий последовательно выводит в документ HTML две таблицы, соответствующие созданным объектам, вызывая для этого методы printTableHead, printRecord и printTableEnd.

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

Массивы в JavaScript

Язык сценариев JavaScript допускает работу с массивами встроенных объектов, объектов браузера и объектов, созданных программистом. К сожалению, нет единого способа создания массивов, пригодного для применения в разных версиях браузеров. Мы расскажем вам о двух способах, первый из которых необходим для версий браузеров Netscape Navigator, более ранних чем 3.0, а второй используется новыми браузерами фирм Netscape и Microsoft.

Первый способ предполагает создание собственного класса. Это можно сделать, например, так:

function createArray(nLength)

{

this. length = nLength;

for(var i = 1; i <= nLength; i++)

{

this[i] = 0;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14