Think.JS №16

  • Для начинающих: Курс молодого бойца

Содержание

Для начинающих: Курс молодого бойца

Для начинающих

Курс молодого бойца

Сегодняшняя рассылка посвящена базовым понятиям языка JavaScript. В ней нет полезных скриптов, зато есть много букв.

Переменная

Переменная является базовым понятием практически любого языка программирования и означает поименованное значение. Программа (в нашем случае скрипт) обращается к значению переменной по ее имени. В JavaScript переменные объявляются при помощи специального служебного слова “var”
(от variable – переменная). Использование этого слова не является обязательным, однако усиленно рекомендуется, так как при этом улучшается читабельность скрипта. Имя переменной должно быть уникальным для текущей области видимости (см. ниже), иначе предыдущее значение переменной будет утеряно. Желательно, чтобы имя переменной отражало смысл ее значения – это также помогает при чтении и редактировании скрипта. Имена переменных должны состоять из латинских букв, цифр и знака подчеркивания, причем начинаться имя переменной с цифры не должно. Использование других символов (например, знаков кириллицы) приведет к ошибке. Имена также не должны совпадать с зарезервированными словами JavaScript.

variables.jsx
Скрипт демонстрирует работу с переменными
var myNum0 = 10;
var myNum1 = 20;
var myNum2 = myNum0 + myNum1;

Переменные в JavaScript не типизированы. Это означает, что одна и та же переменная в процессе выполнения скрипта может содержать значения различных типов (например, сначала числовое, а затем строковое), в отличие, например, от языка Си, где каждая переменная заранее объявляется с указанием типа, причем попытка передать переменной значение, не соответствующее объявленному типу, вызовет ошибку. У каждого метода представления переменных есть свои плюсы и минусы. Использование не типизированных переменных позволяет обходиться минимальным количеством переменных, создавая их в произвольном месте скрипта по необходимости. При этом также возможно преобразование типа переменной без введения дополнительных переменных для хранения промежуточных данных. Однако такая свобода при использовании имеет обратную сторону. При некоторых операциях может происходить неявная смена типа переменной, что может кардинальным образом отразиться на выполнении скрипта.

convertType.jsx
Скрипт демонстрирует неявное преобразование типов
var myNum0 = "121";
// Объявляем текстовую переменную
var myNum1 = 121;
// Объявляем числовую переменную
alert(myNum1 + myNum0);
// Получаем результат суммирования

Переменная myNum0 содержит строковое значение (текст), которое заключается в одинарные или двойные кавычки. Переменная myNum1 содержит числовое значение. При сложении переменных числовое значение неявно преобразуется в строковое, поэтому результат получается строковым значением «121121», а не 242. Эта особенность переменных при невнимательной разработке может привести к трудно обнаруживаемым ошибкам.

Кроме значений различных типов, переменные в ExtendScript могут содержать ссылки на объекты InDesign. Например, var myDoc = app.activeDocument объявляет, что переменная myDoc будет соответствовать документу InDesign, который в этот момент был открыт и активен. Причем ссылка эта сохранится даже в том случае, если во время выполнения скрипта станет активным другой документ (переменная указывает не на свойство app.activeDocument, а на объект типа document, на который в данный момент указывает это свойство). В принципе, для обработки объектов InDesign не обязательно создавать переменные, которые бы указывали на них (есть мнение, что от большого количества таких ссылочных переменных работа скрипта тормозится), но в таком случае скрипт будет трудно читать и редактировать, поскольку ссылки вида app.documents[3].pages[2].textFrames[0].insertionPoints.lastItem().pointSize не слишком приспособлены для человеческого восприятия.

Область видимости переменной

Как уже было сказано, переменная должна обладать уникальным именем в пределах области видимости, иначе при повторном объявлении переменной ее предыдущее значение будет утрачено. Однако одно и то же имя переменной может быть использовано в разных функциях да же в том случае, если в одной из функций происходит вызов другой функции (а значит, есть возможность одновременного «существования» двух одноименных переменных). При этом переменные обязательно должным быть объявлены внутри функции при помощи ключевого слова var.

varVisible.jsx
Скрипт демонстрирует использование одноименных переменных с разной областью видимости
function increment () {
	var counter = 0;
	alert(counter);
}
for (var counter = 0; counter < 10; counter++) {
	increment();
	alert(counter);
}

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

Строковые переменные

Строковые переменные предназначены для хранения текстовых данных. При объявлении строковой переменной ее значение заключается в одинарные или двойные кавычки. Соответственно, возникает проблема, как передать в значении знак кавычки, чтобы интерпретатор языка не воспринял ее как признак окончания значения. В таких случаях используются специальные символы, состоящие из обратного слеша и нужного знака, например, var myString = "\"Горе от ума\"". Для получения знака обратного слеша используется сочетание «\\». Также при помощи обратного слеша задаются таки символы, как знак табуляции “\t”, перехода на новую строку “\n” и некоторые другие.

Строковое значение свойства contents у текстовых объектов InDesign является строкой символов уникода. В уникод-представлении каждый символ определяется четырехзначным шестнадцатеричным числом. В JavaScript символ уникода записывается следующим образом: \u0000 – обратный слеш, буква u (unicode) и четырехзначное число. Например, уникод-символ знака пробела имеет вид “\u0020”. Уникод-символ знака можно узнать в панели Info, выделив нужный символ.

Для обработки строковых переменных предусмотрено значительное количество функций, которые работают очень быстро по сравнению со штатными методами обработки текстовых объектов InDesign. Этой особенностью бы будем пользоваться неоднократно в различных скриптах, связанных с обработкой текстовых объектов (форматирование, поиск, замена и т.п.). Строковые переменные также поддерживают обработку при помощи регулярных выражений, которые в JavaScript проработаны достаточно качественно, что позволяет добиваться потрясающей эффективности скриптов.

Логические переменные

Логические переменные могут содержать только два значения: true (правда) и false (ложь). В InDesign логические переменные часто используются в объектах как значения свойств, которые могут находиться в двух состояниях: выключенном и включенном. Кроме того, все проверки с условием if .. else используют в качестве параметра значение логического выражения, например if (app.documents.length > 0) {} будет выполняться только в том случае, если значение свойства app.documents.length будет больше ноля. Для работы с логическими выражениями используются специальные операторы. Знак логического равенства состоит из двух идущих подряд символов равенства «==»
(одиночный используется для обозначения присваивания переменной значения), например if (app.documents.length == 0) {}будет выполняться только в том случае, если app.documents.length имеет значение, равное 0. Знак логического неравенства имеет вид «!=» и используется следующим образом: if (myResult != 0) {}. Одиночный символ «!» перед логическим значением используется для отрицания этого значения (если значение равно true, то после отрицания его значение становится равным false и наоборот).

Для совокупной проверки нескольких логических выражений используются операторы «&&» и «||», соответственно «логическое и» и «логическое или». Используются они следующим образом: if (myNum > 0 && myNum < 5) {}. Приведенное выражение будет выполняться только в том случае, если переменная myNum будет больше 0 и меньше 5. Выражение if (myNum > 0 || myNm < 5) {} будет выполняться в том случае, если одно из условий будет иметь значение true (если myNum будет больше, чем 0 или myNum будет меньше 5). Это выражение полностью равнозначно if (myNum < 5) {}.

Массив

Массивом – это специальный объект, который состоит из определенного количества переменных (которые в свою очередь могут быть массивами, равно как и объектами другого типа). К каждому элементу массива можно обратиться по его индексу (порядковому номеру), поэтому массивы очень удобно обрабатывать при помощи циклов. Объявлять переменную как массив в JavaScript можно несколькими способами.

createArrays.jsx
Скрипт демонстрирует различные способы создания массивов
// Объявление массива при помощи квадратных скобок
var myArr_0 = [];
// Объявление массива при помощи квадратных скобок с указанием элементов
var myArr_1 = [3,5,7];
// Объявление массива по вызову конструктора (заметим, что второй элемент является текстовым)
var myArr_2 = Array(3,"5",7);
// Объявление массива по вызову конструктора с использованием ключевого слова new
var myArr_3 = new Array();
// Объявление массива по вызову конструктора с использованием ключевого слова new и указанием элементов
var myArr_4 = new Array(3,5,7);

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

Чтобы получить значение элемента массива с определенным индексом, нужно обратиться к нему используя имя массива и индекс нужного элемента, например alert(myArr_4[0]). Элементы массива нумеруются, начиная с 0, а не с 1, как, например, в VB. Эту особенность всегда нужно учитывать при обработке массивов. Свойство length содержит размер массива – количество элементов в нем. Индекс последнего элемента массива всегда меньше свойства length на единицу.


Олег Бутрин
THINK.JS выпуск № 16 от 2007-02-19

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s