Краткая терминология скриптов
JavaScript — интерпретируемый язык
Как и большинство языков сценариев, JavaScript интерпретируется средой, в которой он выполняется. JavaScript не компилируется в бинарный код наподобие .ехе. Недостаток интерпретируемого языка — для выполнения кода затрачивается много времени, поскольку среда (Adobe InDesign) компилирует директивы во время выполнения. Однако есть и преимущество — можно легко и быстро усовершенствовать исходный код.
JavaScript является объектно-ориентированным языком
Вы будете работать с объектами, которые инкапсулируют данные (свойства) и поведение (методы). Однако, хоть и можно работать с объектами, их невозможно разделить на подклассы. Объектная модель JavaScript основывается на экземплярах, а не на концепции наследования.
Комментарии в JavaScript
В JavaScript комментарии в скрипте пишутся так:
// комментарий
Или так:
/* Это длинный комментарий
в несколько
строк*/
Типы данных в JavaScript
1. Тип Undefined (неопределенный)
Этот тип состоит из единственного значения undefined. Это значение, которое принимает переменная, которая объявлена в программе, но которой еще не присвоено никакого значения.
2. Тип Null (нулевой)
Этот тип состоит из единственного значения null. Это значение означает нулевую, пустую или несуществующую ссылку.
3. Тип Boolean
Логический тип данных. Имеет всего два значения — True и False
4. Тип String — строковые данные — последовательность текстовых символов, заключенных в кавычки, например, «это строка». Можно применять для строк и одинарные кавычки — ‘это строка’. Но нельзя применять одновременно и двойные и одинарные кавычки. ‘Hello World” — вызовет ошибку.
Как надо поступить, если надо написать в скрипте такое слово, как Д’Артаньян, в котором уже есть одинарная кавычка? Ведь эта кавычка будет истолкована как конец строки. И три кавычки в одном выражении вызовут ошибку. В этих случаях ставят перед кавычкой в тексте обратную косую черту, чтобы указать, что данный символ является частью текста.
alert(‘Д’Артаньян’) — неправильно
alert(‘Д\’Артаньян’) — правильно
Так же поступают и в случае двойных кавычек.
Обратная косая черта выступает как служебный символ. Ну а как поступить, если её надо отобразить в тексте? В этом случае надо писать её два раза — \\.
Развивая тему, скажем, что для переноса строки используется последовательность \n,
для знака табуляции — \t. Полный список вы найдете в любом справочном руководстве по JavaScript.
5. Тип Number (числовой)
а) Integer — это целые числа, например, 15. Они могут быть как положительными, так и отрицательыми. Диапазон: от –2 в степени 53 до +2 в степени 53
б) Floating — числа с плавающей точкой, например, 8,687
6. Тип Object (объектный)
Значением этого типа являются объекты.
JavaScript — слабо типизированный язык. Он отличается от типизированных языков, таких как Java и C++, которые требуют объявления всех переменных определенных типов перед началом их использования. JavaScript, наоборот, очень гибок. Вы не обязаны объявлять переменные специального типа. Если специальный тип вам неизвестен, то можно работать с переменной. Последнее утверждение иллюстрируется фрагментом кода. Например, требуется объявить переменную myVal, присвоить ей строковое значение и отобразить ее в окне сообщений. Можно воспользоваться следующим кодом:
function flexible () {
var myVal; // объявляем переменную myVal
mVal = «Pi»; // присваивает myVal некоторое значение
alert (myVal); // используем ее
}
Хотя явное объявление переменных и отражает хороший тон программирования, вовсе не обязательно проделывать это. Следующий код, прекрасно функционирующий в JavaScript, окажется просто немыслимым в типизированных языках.
function flexible () {
mVal = «Pi» // устанавливаем, значение необъявленной переменной myVal
alert (myVal) // используем ее
}
Следующий пример продемонстрирует всю гибкость языка JavaScript — можно изменить тип значения, представляемого переменной. Например, переменная myVal в процессе выполнения функции изменяет строковое значение на численное:
function flexible () {
var myVal = «Pi»;
alert (myVal);
myVal = 3.14159;
alert (myVal); }
Преобразование из одного типа в другой
//Преобразование из числа в строку:
myNumber = 2;
myString = myNumber + «»;
//Преобразование из строки в целые:
myString = «2»;
myNumber = parseInt(myString);
//Если строка содержит десятичное значение используйте «parseFloat» раньше чем «parseInt»:
myNumber = parseFloat(myString);
//Вы можете преобразовывать строки в числа используя следующий метод:
myNumber = +myString;
Переменные
Переменные являются контейнерами для значений. Переменные могут содержать цифры, строки текста или объекты Индизайна.
Переменным присваиваются значения следующим способом:
var myNumber = 10;
var myString = «Hello, World!»;
var myTextFrame = myDocument.pages.item(0).textFrames.add();
Оператор var используется для объявления переменной, и использование его вне функций опционально. Вы также можете объявлять более одной переменной за один раз, назначая им значения одновременно:
var i = 0, x, max = 57;
Присвоение переменным понятных имен делает программный код более читаемым. Например, «myFirstPage» а не «с» или «х». Имена переменных должны быть одним словом, причем допускается применение как строчных так и заглавных символов, а также знака подчеркивания (my_first_page). Имена переменных не могут начинаться с цифры и не могут содержать в себе знаки пунктуации и кавычки.
Переменные в JavaScript чувствительны к прописным и строчным буквам. Так, например, переменные myTextframe и myTextFrame — разные переменные.
В JavaScript все переменные, перед которыми не стоит var, считаются глобальными, не привязанными ни к одной функции. Adobe рекомендует использовать var если в скрипте более чем 1 функция.
Массивы
AppleScript, JavaScript и VBScript поддерживают массивы — списки переменных. Например, для JavaScript:
myArray=[1, 2, 3, 4];
Для доступа к определенному значению массива используются индексы. Нумерация членов массива для JavaSсript начинается с нуля. Например, первый член массива:
myFirstArrayItem = myArray[0];
Массивы могут включать в себя другие массивы, как показано ниже
var myArray = [ [0, 0], [72, 72] ];
Подробнее о свойствах и методах массивов будет рассказано позже
Определение типа переменной
Иногда скрипты должны принять решение, основанное на типе объекта. Например, если вы работаете с выделением текста и вам надо чтобы скрипт остановился, когда выделенным становится элемент страницы.
//Присвоение переменной неизвестного типа, «myMysteryVariable»…
myType = myMysteryVariable.constructor.name;
//myType will be a string corresponding to the JavaScript type (e.g., «Rectangle»)
Операции инкремента, декремента
Это операции ++ и —. Так y++ (инкремент) является сокращенной записью y = y+1, аналогично y- — (декремент) есть сокращенная запись выражения y=y-1.
Но с этими операциями есть одна тонкость. Они существуют в двух формах — префиксной (++y) и постфиксной (y++). Действие этих операций одно и то же — они увеличивают (операции декремента — уменьшают) свой операнд на 1, а вот результат у них разный. Префиксная форма в качестве результата выдает уже измененное на единицу значение операнда, а постфиксная — значение операнда до изменения.
a = 5;
x = a++;
y = ++a;
В этом фрагменте x получит значение 5, а y станет равной 7.
Как отмечалось выше, у операторов инкремента ++ и декремента — есть префиксная и постфиксные формы. В префиксной форме оператор указывается перед операндом (например, ++A или —A), а в постфиксной форме оператор указывается после операнда (например, A++ или A—). По отношению к значению операнда разницы в префиксной и постфиксной формах нет. Так, что в результате выполнения инструкции A++ значение переменной A будет увеличено на 1. Но если инструкция с оператором инкремента или декремента сама является частью более сложного выражения, то имеет значение, в какой форме (префиксной или постфиксной) использован оператор. Общее правило состоит в следующем. Если в выражении использовано подвыражение с оператором инкремента/декремента в префиксной форме, то сначала выполняется операция инкремента/декремента, и только после этого вычисляется значение выражения. Если же в выражении есть подвыражение с оператором инкремента/декремента в постфиксной форме, то сначала вычисляется значение выражения, а затем выполняется операция инкремента/декремента. Проиллюстрируем сказанное на простом примере.
Рассмотрим следующий программный код:
var x,y
x=10
y=x++
Код достаточно простой: объявляются две переменные x и y, и каждой из них присваивается значение. Вопрос такой: каковы будут значения переменных x и y после выполнения кода? Ответ состоит в том, что переменная x будет иметь значение 11, а переменная y будет иметь значение 10. Теперь постараемся разобраться, почему результат именно такой. Начнем с команды x=10, которой переменной x присваивается значение 10. Далее выполняется команда y=x++. Здесь единственная интрига связана со способом вычисления выражения. А именно, возникает вопрос, как нам следует поступить: сначала увеличить на единицу значение переменной x и уже это значение присвоить переменной y или следует сначала присвоить переменной y текущее значение 10 переменной x, а затем увеличить значение x на единицу? Поскольку оператор инкремента использован в постфиксной форме, то сначала выполняется присваивание (переменная y получает значение 10), а затем значение переменной x увеличивается на единицу (становится равным 11).
Достаточно немного изменить код, и мы получим иной результат:
var x,y
x=10
y=++x
В этом случае обе переменные x и y в конечном счете получат значение 11. Причина в том, что при выполнении команды y=++x, поскольку оператор инкремента использован в префиксной форме, сначала значение переменной x становится равным 11, а затем данное значение присваивается переменной y.
На ситуацию можно посмотреть и по-другому (и это будет даже лучше). Например, рассмотрим такой код:
var x,y
x=10
y=x++ + x++
Вопрос традиционный: какими будут значения переменных x и y?
Чтобы дать ответ, будем исходить из того, что в постфиксной форме оператор инкремента увеличивает значение операнда, но возвращает старое значение. Выражение y=x++ + x++ в правой части содержит сумму двух слагаемых: x++ и x++. Значения слагаемых вычисляются справа налево. При вычислении первого слагаемого x++ значение переменной x увеличивается на 1 (значение переменной x становится равным 11), но результатом выражения x++ возвращается старое значение 10. При вычислении второго слагаемого x++ значение переменной x еще раз увеличивается на 1 (теперь значение переменной равно 12), но результатом выражения x++ возвращается старое значение 11. Таким образом, значение переменной y представляет собой сумму чисел 10 и 11, что дает 21. А значение переменной x равно 12.
Если исходить из того, что оператор инкремента в префиксной форме увеличивает на единицу значение операнда и возвращает результатом новое значение, легко проанализировать следующий программный код:
var x,y
x=10
y=++x + ++x
Теперь значение переменной x будет равно 12, а значение переменной y равняется 23. Почему? Потому что при вычислении первого слагаемого ++x получаем значение 11, переменная x также имеет значение 11. При вычислении второго слагаемого ++x получаем 12. Значение переменной x тоже равно 12. В итоге x равно 12, а значение y равно 23 (сумма 11 и 12).
Операции сравнения
Это операции >, <, >=, <=, != и ==. Следует обратить внимание, что сравнение на равенство обозначается двумя знаками равно. Использование одного знака равенства приведет к ошибке.
Операндами этих операций могут быть арифметические данные, результат — типа boolean.
MyWidth > myHeight
Результатом будет true (1), если MyWidth больше myHeight, в противном случае false (0)
Кроме того, существуют еще и такие операции сравнения: === и !==.
Подчеркнем лишь принципиальные отличия между операторами == и ===, а также != и !==. Опять же, если речь идет о сравнении числовых значений, то разницы, например, между операторами == и === нет. Скажем, результатом выражения 123==123 является значение true, и результатом выражения 123===123 также является значение true. Но вот результаты выражений 123==»123″ и 123===»123″ разные. Результатом выражения 123==»123″ является значение true. Значение выражения 123===»123″ равно false. Второй случай, скорее всего, вопросов не вызовет: вполне логично, что числовое значение 123 не равно тексту «123». Почему же тогда результат выражения 123==»123» равен true? Все дело в автоматическом преобразовании типов. При вычислении выражения 123===»123″ автоматическое преобразование типов не применяется, поэтому получаем вполне ожидаемый результат. А вот при вычислении выражения 123==»123″ текстовое значение «123», являющееся на самом деле текстовым представлением числа 123, преобразуется в числовое значение 123. В результате получается, что оба операнда одинаковы.
Точно так же обстоят дела с операторами != и !==. В первом случае при сравнении операндов при необходимости выполняется автоматическое преобразование типов, во втором случае — нет.
Операция целочисленного деления
Нужно учитывать, что деление одного целого на другое выдает целое, причем не округляет, а отбрасывает дробную часть.
Остаток от деления (значение по модулю)
В JavaScript имеется операция «%», которая обозначает остаток от деления.
Расширенные операции присваивания
Кроме обычной операции присваивания (=) в JavaScript существуют операции +=, -=, *=, /= и др. Это сокращенные записи. Так a += b полностью эквивалентна a = a + b. Аналогично и с другими такими операциями.
Логические операции
! — отрицание
&& — логическое «и»
|| — логическое «или»
Операнды этих операций должны быть типа boolean, результат — boolean. Операции && и || имеют одну особенность — их правый операнд может и не вычислиться, если результат уже известен по левому операнду. Так, если левый операнд операции && — ложь (false), то правый операнд вычисляться не будет, т.к. результат все равно — ложь.
Это свойство нужно учитывать, особенно тогда, когда правый операнд содержит вызов некоторой функции.
Побитовые логические операции
Это операции
& — побитовое \’и\’
| — побитовое \’или\’
^ — побитовое \’исключающее или\’
~ — побитовое отрицание
Они выполняются для каждой пары битов своих операндов.
Операции сдвига
<< — сдвиг влево
>> — сдвиг вправо
>>> — беззнаковый сдвиг вправо
Эти операции сдвигают значение своего левого операнда на число бит, заданное правым операндом.
Операторы
Операторы используют переменные и данные для вычислений (сложение, вычитание, умножение, деление)
MyWidth/2
Для сложения строк в JavaScript используется знак плюс. Пример:
«Pride » + «and Prejudice»
//В результате получится строка: «Pride and Prejudice»
Операторы условий if…else
Условные операторы содержат в себе логические сравнения и всегда начинаются со служебного слова if (если).
Оператор if…else выполняет один набор действий (операторов) если условие выполняется, и другой набор действий (операторов), если условие не выполняется:
if (app.selection[myCounter].constructor.name==»Rectangle»){
alert(«Выделен прямоугольник»);
}
else {
alert(«Выделен не прямоугольник»);
}
В JavaScript принято выделять фигурными скопками набор операторов, даже если этот набор состоит из одного оператора.
Оператор Switch
Сравнивает значение выражения, указанного в скопках после Switch, со значениями выражений, указанными после case. Если выражения равны между собой, то происходит выполнение каких-то действий. Если значение выражения после switch не равно ни одному из значений выражений во всех case, то происходит набор действий, определенный после default.
myPageItem = app.selection[0];
switch(myPageItem.constructor.name){
case «Rectangle»:
alert(«Вы выбрали прямоугольник»)
break;
case «Oval»:
alert(«Вы выбрали овал»)
break;
case «TextFrame»:
alert(«Вы выбрали текстовый фрейм»)
break;
default:
alert(«Пожалуста выберите прямоугольник, овал или текстовый фрейм»)
break;
}
Циклы
Циклы реализуют многократные повторные процессы. Как будто бы мы сказали Индизайну выполнить действие 20 раз. Такие структуры чаще всего начинаются со служебного слова for.
Формат оператора for такой:
for ([initial-expression]; [condition]; [increment-expression])
{Операторы}
В круглых скопках после for могут стоять три необязательных выражения:
1) инициализация счетчика; 2) условие, которое проверяется каждый раз в начале нового цикла, т.е. повторы действий происходят до тех пор, пока выполняется условие; 3) приращение счетчика.
В фигурных скопках — блок операторов. Пример:
var Sum=0;
for(i=0; i<10; i++) {
Sum=Sum+5;
}
Оператор цикла While выполняет действия пока условие в круглых скопках выполняется (результат выражения есть true). В следующем примере цикл выполняется до тех пор, пока переменная i не достигнет значения 11.
var i = 0;
while(i<11)
{
Sum=Sum+5;
i++;
}
При работе этого оператора сначала проверяется условие. Если оно, верно, выполняется код (первая итерация). Затем снова проверяется условие, и т.д. Возможен вариант, когда цикл не выполнится ни разу.
Оператор цикла do…while (делай до тех пор, пока) выполняет набор действий в зависимости от условия. Условие дальнейшей работы цикла задается в конце блока операторов. Это гарантирует, что цикл выполнится хотя бы один раз (в отличие от предыдущего оператора).
var i = 0;
do {
Sum=Sum+10;
i+=2;
}
while(i<20);
Опрератор Continue
Используется в вышеприведенных трёх циклах. Он прерывает на каком то шаге выполнение цикла и приводит к его рестарту (к проверке условия цикла)
var i = 0;
var myExtension = 0;
while (i < 10)
{
i++;
if (i==7)
continue;
myExtension += myExtensions[i];
}
В этом примере суммируются 10 членов массива myExtensions, за исключением члена массива с индексом 7.
Оператор Break
Используется в циклах. Служит для прерывания цикла и выхода из него
var i = 0;
var myExtension = 0;
while (i < 10)
{
myExtension += myExtensions[i];
if(myExtension>1000)
{
break;
}
i++
}
В этом примере тоже происходит суммирование членов массива, но когда сумма превыcит значение 1000, цикл принудительно прекращается. Break, как вы уже видели, также используется в операторе Switch.
Функции, оператор return
Это скриптовые модули, к которым вы можете обратиться в пределах вашего скрипта. Как правило, в функцию передаются какие-то значения, например, для вычислений, а возвращаться может результат вычислений. Функции позволят избежать многократного повторения одних и тех же строчек скрипта. Общий формат функции такой:
function name([param] [, param] […, param])
{statements}
Слово function является зарезервированным словом. Ни одна переменная не может называться словом function. Если функция возвращает результаты вычислений, то используется оператор return.
Пример:
function calc(a, b, c)
{
return (a+b+c)/3;
}
Последние комментарии