ДЕЙСТВИТЕЛЬНЫЕ ТИПЫ ДАННЫХ Действительные типы определяет те данные, которые реализуются подмножеством действительных чисел, допустимых в данной ЭВМ. Тип | Диапазон значений | Количество цифр мантиссы | Требуемая память (байт) | Real | 2.9e-39 .. 1.7e+38 | | | Single | 1.5e-45 .. 3.4e+38 | | | Double | 5.0e-324 .. 1.7e+308 | | | Extended | 3.4e-4932 .. 1.1e+4932 | | | Comp | -9.2e+18 .. 9.2e+18 | | | Тип Real определен в стандартном ПАСКАЛЕ и математическим сопроцессором не поддерживается. Остальные действительные типы определены стандартом IEEE 457 и реализованы на всех современных компьютерах. Для их использования при наличии сопроцессора или при работе на ЭВМ типа 80486 необходимо компилировать программу с ключом* {$N+}, а при отсутствии сопроцессора - с ключами {$N-,$E+}. Тип Comp хотя и относится к действительным типам, хранит только длинные целые значения. Над действительными операндами можно выполнять следующие арифметические операции, дающие действительный результат: сложение + , вычитание - , умножение * , деление /. К величинам действительного типа применимы все операции отношения* , дающие булевский результат. Один из операндов, участвующих в этих операциях, может быть целым. К действительным аргументам применимы функции, дающие действительный результат: Abs(X), Sqr(X), Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X), Frac(X), Int(X), Pi. Функция Frac(X)возвращает дробную часть X, функция Int(X) - целую часть X. Безаргументная функция Pi возвращает значение числа действительного типа. К аргументам действительного типа применимы также функции Trunc(X)и Round(X), дающие целый результат. Первая из них выделяет целую часть действительного аргумента путем отсечения дробной части, вторая округляет аргумент до ближайшего целого. 9. Тип даты Тип данных Date (Visual Basic) является 64-разрядным значением, содержащим сведения о дате и времени.Каждое приращение представляет интервал времени в 100 наносекунд, начиная с 00:00 1-го января 1-го года по григорианскому календарю.Если переменная может содержать значение даты, значение времени, или оба этих значения, объявите ее в качестве Date. Содержит 64-разрядные (8-байтные) значения IEEE, представляющие даты в диапазоне от 1 января 0001 года до 31 декабря 9999 года и время от 00:00:00 (полночь) до 23:59:9999999.Каждое приращение представляет 100 наносекунд затраченного времени с начала 1 января 1 года по григорианскому календарю.Максимальное значение представляет 100 наносекунд перед началом 1 января 10 000 года. Заметки Используйте тип данных Date, содержащий значения даты, времени или даты и времени. Значение по умолчанию Date: 0:00:00 (полночь) 1 января 0001 года. Текущие дату и время можно получить из класса DateAndTime. Требования к формату Необходимо заключить литерал Date в символы решетки (# #).Необходимо указать значение даты в формате М/д/гггг, например#5/31/1993#, или гггг-ММ-дд, например #1993-5-31#.При указании года сначала можно использовать символы косой черты.Это требование не зависит от языкового стандарта и настроек формата времени и даты компьютера. Причина этого ограничения связана с тем, что значение кода никогда не должно изменяться в зависимости от языкового стандарта, который использует приложение.Предположим, что литерал Date жестко закодирован как #3/4/1998#, что это означает 4 марта 1998 года.В языковом стандарте, использующем формат дд/мм/гггг, 3/4/1998 компилируется, как предполагается.Однако предположим, что приложения развертывается в разных странах.В языковом стандарте, использующем формат мм/дд/гггг, ваш жестко закодированный литерал будет компилироваться как 3 апреля 1998 года.В языковом стандарте, использующем формат гггг/мм/дд, литерал будет недопустимым (апрель 1998, 0003) и вызовет ошибку компилятора. Методы обхода проблемы Для преобразования литерала Date в формат языкового стандарта или пользовательский формат, передайте литерал функции Format, указав стандартный или пользовательский формат даты.В следующем примере это показано. MsgBox("The formatted date is " & Format(#5/31/1993#, "dddd, d MMM yyyy")) Кроме того, для формирования значения даты и времени можно использовать один из перегруженных конструкторов структурыDateTime.В следующем примере создается значение для представления даты и времени 12:14 31 мая, 1993 г. Dim dateInMay As New System.DateTime(1993, 5, 31, 12, 14, 0) Часовой формат Значение времени можно указать в 12- или 24-часовом формате, например #1:15:30 PM# или #13:15:30#.Однако если не указать значение минут или секунд, необходимо указать AM или PM. Дата и время по умолчанию Если не указать дату в литерале даты и времени, Visual Basic задает часть даты как 1 января 0001 года.Если в литерал даты и времени не включено время, Visual Basic задает часть значения времени как начало дня, то есть полночь (0:00:00). Преобразования типов При преобразовании значения Date типа String Visual Basic отображает дату в формате короткой даты, определяемом языковым стандартом времени выполнения. Время отображается в формате времени (12- или 24-часовом), определяемом языковым стандартом времени выполнения. Советы по программированию - Вопросы взаимодействия. При взаимодействие с компонентами, которые не написаны для платформы .NET Framework (например, автоматизация или COM-объекты), необходимо помнить, что в других средах типы даты и времени несовместимы с типом Date Visual Basic.Если вы передаете аргумент даты и времени такому компоненту, объявите его Double, а не как Date в новом коде Visual Basic и используйте методы преобразования DateTime.FromOADate и DateTime.ToOADate.
- Символы типа. Date не содержит знак типа литерала или типа идентификатора.Однако компилятор обрабатывает литералы, заключенные в решетки (# #), как Date.
- Тип Framework. В .NET Framework данный тип соответствует структуре System.DateTime.
10. String Строки в javascript - полностью юникодные. - Кавычки двойные и одинарные работают одинаково
- Можно указывать юникодные символы через \uXXXX:
- Встроены регулярные выражения, методы replace/match:
- "превед медвед".replace(/(.*?)\s(.*)/, "$2, $1!") // => медвед, превед!
Как это обычно и бывает, в регулярках символ \w обозначает латинские буквоцифры или подчеркивание, но не русские буквы. Длина строки хранится в свойстве length. 11. Массив – это упорядоченная совокупность данных одного типа (см. типы данных VBA). Порядок элементов массива задается индексами его элементов. Количество элементов определяет размер массива, а количество индексов (в VBA - до 60) - его размерность. VBA поддерживает статические идинамические массивы. Статический массив имеет фиксированный размер и размерность, заданные при объявлении и неизменяемые в ходе выполнения программы. Синтаксис объявления статического массива: (Public | Private | Dim) <имяМассива> (<размер1>, <размер2>, ..., <размер N>) As <типДанных> Указанные в скобках величины <размер1>, <размер2>, …, <размер N> задают количество индексов и максимально допустимое значение для каждого конкретного индекса (его верхняя граница). Таким образом, определяются размерность массива (количество индексов) и размер массива – количество элементов данного массива. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление Dim Array1 (9) As Integer, определяет одномерный массив из 10 целых чисел, а объявление Dim Array3 (4, 9) As Variant, определяет двумерный массив из пятидесяти (5х10) элементов типа Variant. В VBA имеется возможность изменить индекс нижней границы с помощью оператора Option Base (указание Option Base 1 или Option Base 0 в общем разделе модуля). Более того, при объявлении массива можно явно указать и верхнюю, и нижнюю границы. Синтаксис оператора объявления массива с указанием границ для индексов: Dim <имяМассива> (<мин1> To <макс1>[, ..., <минN> To <максN>]) As <типДанных> Примеры: Dim A (1 To 3, 1 To 3) As Single Dim B (1 To 12) As Integer Правила инициализации элементов массива такие же, как и для переменных того типа, который использован при объявлении массива. Доступ к элементам массива выполняется по индексу. Листинг 19 иллюстрирует работу с одномерным массивом. Листинг 19. Обращение к элементам массива ' ЗАДАЧА: Сгенерировать 10 случайных целых чисел от 0 до 100, ' записать их в массив и вывести в окно отладчика Sub sample14() Randomize Timer ' запуск генератора случайных чисел Dim myarr(1 To 10) As Long ' объявление массива ' запись чисел в массив For i = 1 To 10 myarr(i) = Round(Rnd * 100) Next ' чтение элементов массива и вывод значений в отладчик For i = 1 To 10 Debug.Print myarr(i) Next End Sub Удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в массив из этих значений: Dim A As Variant A = Array (10, 20, 30) B = A(2) В данном примере переменная А создается как одномерный массив, состоящий из трех элементов (10, 20, 30), а переменная В принимает значение второго элемента массива А (20). VBA поддерживает использование динамических массивов, размер и размерность которых может изменяться во время выполнения программы. Объявление динамического массива аналогично объявлению статического, но при этом не задаются ни размер, ни размерность: Dim <имяМассива> () As <типДанных> Для указания и изменения размеров такого массива используется специальный оператор - ReDim: ReDim <имяМассива> (<размер1>, <размер2>, ..., <размер N>) Размерность и размер определяется динамически в той процедуре и в тот момент, когда они становится фактически известной. Обратите внимание, в этом операторе границы изменения индексов можно задать не только как константы, но и как выражения, зависимые от переменных. Для повторных изменений массива можно снова использовать оператор переопределения ReDim. При каждом переопределении динамического массива все его значения теряются. Чтобы сохранить все ранее полученные элементы необходимо использовать ключевое слово Preserve при переопределении. Листинг 20 демонстрирует работу с динамическим массивом (нумерация строк приведена только для удобства пояснений). Листинг20. Работа с динамическим массивом 1: Public Vector() As Integer 2: Public Sub DMassiv() 3: Dim N As Byte, I As Byte 4: 5: N = InputBox("Введите фактическую размерность вектора") 6: ReDim Vector(N) 7: For I = 1 To N 8: Vector(I) = 2 * I + 1 9: Next I 10: 11: 'Массив расширяется с сохранением ранее вычисленных элементов 12: ReDim Preserve Vector(2 * N + 1) 13: For I = N + 1 To 2 * N + 1 14: Vector(I) = 2 * I 15: Next I 16: Debug.Print "Элементы массива Vector:" & Chr(13) 17: For I = 1 To 2 * N + 1 18: Debug.Print Vector(I) 19: Next I 20: End Sub Поясним приведенный код. Сначала на уровне модуля объявляется глобальный динамический массив Vector (строка 1). В момент объявления размерность динамического массива не указывается, соответственно не выделяется память. Все это произойдет позже, в процессе выполнения программы. Далее приводится одна из возможных процедур, работающая с этим массивом Vector. В строке 12 массив переопределяется (увеличивается его размер) с сохранением предыдущих значений. Затем массив расширяется (цикл в строках 13-15). В последнем цикле (строки 17-19) значения элементов сформированного массива выводятся в окно отладки (Immediate). В рассмотренном примере изменялся размер динамического массива, но не его размерность (массив оставался одномерным). Приведем фрагмент кода программы, в котором изменяются и размер, и размерность динамического массива: 1: Sub sample22 () 2: Dim dArray ( ) As Variant 3: ReDim dArray(1,2) 4: dArray(0,0) = 2 5: dArray(0,1) = 3 6: k = dArray(0,0) + dArray (0,1) 7: ReDim dArray(k) 8: dArray(0) = "Строка1" 9: End Sub В этом примере массив dArray сначала определяется как двумерный массив из шести элементов (2x3) (строка 3), а затем переопределяется как одномерный массив, причем верхняя граница индекса задается значением k (строка 7). Динамические массивы с успехом можно применять там, где необходимы динамические структуры данных, например списки, стеки, очереди. Пользовательский тип данных VBA поддерживает возможность создавать пользовательские типы данных на основе ранее определенных типов. Такой тип в VBA называется User-defined type (UDT) - тип, определенный пользователем. Это соответствует понятиям типа данных record (запись) в языке Pascal или struct (структура) в языке С/С++. Для создания пользовательского типа предназначен оператор Type. Он позволяет на уровне модуля определить структуру данных, включающую другие разнородные, но логически связанные переменные различных типов. После описания типа на его основе можно создавать и использовать переменные. Синтаксис оператора Type: Type <имяТипа> <имяЭлемента1> As <тип> <имяЭлемента2> As <тип> End Type где: <имяТипа> – имя пользовательского типа данных; <имяЭлемента> – имя структуры, составляющей новый тип данных. С помощью ключевых слов Private и Public можно задать область видимости создаваемого типа. Опции Private и Public указываются в строке объявления типа перед ключевым словом Type. Листинг 21. Пример использования пользовательского типа ' Тип TStudent хранит информацию о студенте. Public Type TStudent ID As Long 'идентификатор LastName As String 'фамилия FirstName As String 'имя MiddleName As String 'отчество BirthDay As Date 'дата рождения End Type ' Учебная группа Public Type TGroup Num As String * 10 'номер группы Students() As TStudent 'список (массив) студентов End Type ' Объявления переменных Private stud As TStudent ' студент Public group As TGroup 'группа Для обращения к элементам пользовательского типа (полям структуры) используется точечная нотация: <имяПеременнойUDT>.<имяЭлемента> Листинг22. Работа с переменными пользовательского типа Sub sample20() ReDim group.Students(10) group.Num = "АС-123" group.Students(0).LastName = "Петров" group.Students(0).FirstName = "Иван" Debug.Print group.Num & group.Students(0).LastName & " " & group.Students(0).FirstName End Sub Широкие возможности, представляемые программисту пользовательским типом имеют ограничение: все операции должны выполняться на уровне полей. Единственная разрешенная операция — присваивание (листинг 23). Листинг 23. Операции над пользовательским типом Sub sample21() Dim group1 As TGroup, group2 As TGroup ReDim group1.Students(25) ReDim group2.Students(28) group1.Num = "AS-123" group2.Num = "AS-456" Debug.Print "1: "; group1.Num, group2.Num ' If group2 > group1 Then ... - Это вызовет ошибку If UBound(group2.Students) > UBound(group1.Students) Then ' Так можно group1 = group2 ' Так тоже можно EndIf Debug.Print "2: "; group1.Num, group2.Num End Sub 12. Структуры. Представьте, что вам надо написать библиотеку для работы с комплексными числами. Ясно, что и результаты функций, и их параметры будут состоять из реальной и мнимой частей. Можно, конечно, для представления комплексного числа пользоваться массивом из двухdouble: /* Complex number as array */ double cmplx[2]; /* [0] - real part, [1] - img */ Можно, но не очень удобно - хотя бы потому, что вместо массива комплексных чисел вам придется работать с двумерным массивом вещественных /* Array of complex numbers-arrays */ double cmplxarr[10][2]; /* [][0] - real part. [][1] - img */ Поэтому в таких случаях гораздо удобнее построить свой тип данных, чтобы переменная такого типа вела себя как одно целое. Для этого надо определить структуру: /* complex.h */ struct COMPLEX { double re; double im; }; или то же самое, но короче /* complex.h */ struct COMPLEX { double re, im; }; Как видите, для определения структуры сначала ставят ключевое слово struct, затем название типа (это не название переменной, а именно название пользовательского типа), а затем в фигурных скобках определяют так называемые поля - таким же образом, как вне структуры вы бы определяли переменные. Так, в нашей структуре для комплексных чисел есть два поля типа double с именами re и im. Обычно, если программа состоит из нескольких файлов, то такое описание типа выносят в файл-заголовок (поэтому я и написал в комментарии complex.h). А потом включают его в те файлы, где таким типом хотят пользоваться. Написав подобное определение, мы теперь можем пользоваться нашим новым типом данных - создавать переменные, указатели на него, массивы, и так далее. Только название нашего нового типа будет 'struct COMPLEX', а не COMPLEX. Вот примеры использования нового типа для создания различных объектов: #include "complex.h" struct COMPLEX number1, number2; /* два числа */ struct COMPLEX arr[10]; /* массив */ struct COMPLEX *ptr; /* указатель */ Кстати, если структура понадобилась только в одном файле, то можно даже совместить описание типа и создание переменных, вот так: struct COMPLEX { double re, im; } number1, *ptr; struct COMPLEX number2; Разумеется, проделывать такое в файле-заголовке не следует, иначе транслятор попытаться создать переменные с одинаковыми именами везде, куда вы этот заголовок включите. Ограничений на типы используемых полей очень немного - это могут быть встроенные типы, массивы, указатели, другие структуры. Нельзя, правда, включить в структуру ее саму в качестве поля. А вот указатель на эту же структуру можно, и этим часто пользуются при описании элемента дерева, связного списка и т.п. Вот пример структуры с разными полями: /* Структура - элемент односвязного списка */ struct LIST_ELM { char info[100]; /* поле-массив char */ /* Поле-указатель на предыдущий элемент */ struct LIST_ELM *prev; }; Прямо при создании структур (имеются в виду переменные, а не само описание типа) их можно инициализировать - задавать полям начальные значения. Форма записи при этом следующая (на примере LIST_ELM): struct LIST_ELM first = { "First item", NULL }; struct LIST_ELM second = { "Second item", &first }; Как видите, в фигурных скобках мы просто перечисляем инициализирующие значения подходящего типа. Разумеется, если бы поле само было структурой или массивом, то для его инициализации нам пришлось бы поставить вложенный список значений в фигурных скобках: struct USELESS { char *p; int a[2]; double d; }; struct USELESS useless = { NULL, { 1,2 }, 3.14 }; Я показал вам, как определять структуры, создавать и инициализировать переменные такого типа. Осталось еще научиться с ними работать. Операторы для работы с создаваемыми пользователем типами - один из признаков объектно-ориентированного языка, и, когда мы доберемся до С++, мы научимся проделывать подобные вещи. Но пока мы стараемся держаться в рамках С, а в нем не предусмотрено операций для работы с пользовательскими типами данных, и относится это не только к структурам. Поэтому с каждым полем вам придется работать, как с самостоятельной переменной. Но прежде всего надо научиться получать доступ к нужному полю. Для этого в С есть два специальных оператора - . (точка) и -> (стрелочка, составленная из минуса и знака "больше"). Точка используется, когда у вас есть сама структура, а стрелочка - если вы работаете с указателем на структуру. Вот как это выглядит в программе (на примере определенного раньше типа COMPLEX): #include "complex.h" struct COMPLEX number, *ptr; /* Работа со полями структуры - точка */ number.re = 1.0; number.im = number.re; /* Работа с полями через указатель - стрелочка */ ptr = &number; ptr->re=1.0; ptr->im=ptr->re; Разумеется, во втором случае можно было бы использовать комбинацию звездочки (доступ через указатель) и точки (*ptr).re=1.0; (*ptr).im=(*ptr).re; но в варианте со стрелочкой транслятору приходится разбираться не с двумя операторами, а с одним. А уж о читаемости программы и говорить не приходится, особенно если поля у вас сами являются указателями на структуры. Попробуйте переписать без стрелочки строку p->next->q1->i=0; и вы сразу это оцените. Вы, наверное, догадались из этих примеров - если отвлечься от формы записи, то можно считать, что поля структур ведут себя, как обычные переменные соответствующего типа. Вы можете ставить поля в выражения, передавать их функциям, получать адрес поля и так далее. Здесь у вас не должно быть особых трудностей, поскольку вы уже видели подобное поведение у элементов массива. Но все-таки структуры придуманы прежде всего для того, чтобы работать с разнородной информацией, как с одним целым. Пока все преимущества, которые мы видели - поля переменной сгруппированы в одном объекте и доступны через имя этой переменной. Что еще можно делать со структурой? Разумеется, передавать в функцию в качестве параметра и возвращать результат. Однако тут есть одна особенность. Если структура несёт в себе большое колличество данных, то передача её как аргумента (передача по значению) приведёт к копированию всех этих данных из одного места в другое. Чтобы избежать подобных накладных расходов эффективней передать указатель на структуру. Вот как это выглядит на практике: #include <stdio.h> #include "complex.h" /* Заносим комплексное значение по указанному адресу */ void set_complex(struct COMPLEX *n, double re, double im) { n->re = re; n->im = im; } /* Складываем два числа, возвращаем результат */ struct COMPLEX *add_complex( struct COMPLEX *n1, struct COMPLEX *n2 ) { static struct COMPLEX result; result.re = n1->re + n2->re; result.im = n1->im + n2->im; return &result; } main() { struct COMPLEX number1, number2, *ptr; set_complex( &number1, 1.0, 1.0); set_complex( &number2, 1,0, 0.0); ptr=add_complex(&number1, &number2); printf("%g %g\n", ptr->re, ptr->im); } Между прочим, попробуйте догадаться, почему я в функции add_complex для хранения результата использовал статическую структуру, а не автоматическую. 13. Перечисления. И, наконец, последний тип - перечисление (enumeration). По-моему, наименее популярный - это можно понять даже по соотношению частоты определения перечислений и структур в той же стандартной библиотеке С. Этот тип позволяет создавать синонимы для последовательности целых чисел, а затем эти синонимы использовать в качестве символических констант. Или использовать сам этот тип в качестве параметра функции. Например, мы можем написать enum BOOLEAN { FALSE, TRUE }; А потом использовать вместо 0 и 1 имена FALSE и TRUE. Или использовать имя нашего типа для задания параметра: void f(enum BOOLEAN flag) { if (flag==FALSE) printf("flag==FALSE\n"); else printf("flag==TRUE\n"); } main() { f(FALSE); f(TRUE); } Удобно, конечно, и программа лучше читается. Вот только С не любит напрягаться на предмет проверки типов. Так что с таким же успехом мы могли бы в main написать f(25), и даже предупреждения от транслятора не увидели бы. Однако все-таки немного расскажу вам про него. Если вы просто перечисляете имена элементов в enum, то первое имя он сделает синонимом нуля, второе - единицы, и так далее в порядке возрастания. Именно поэтому с таким enum, как мы написали выше, FALSE стало синонимом 0, а TRUE - синонимом 1. Однако можно заставить транслятор начать нумерацию с любого числа: enum COLOR { RED = 1, /* Просим начать нумерацию с 1 */ GREEN, /* GREEN == 2 */ BLUE /* BLUE == 3 */ }; Проделывать такое можно не один раз. При этом можно создавать и по несколько синонимов для одного и того же числа. И можно оставлять "пустые места" в последовательности чисел: enum PIXELCOLOR { black, /* black == 0 */ background = 0, /* Тоже 0 */ red, /* red == 1 */ green, /* green == 2 */ /* пропускаем значение 3 */ blue = 4, /* пропускаем 5,6 */ white=7 }; Вот, собственно, и все, что я хотел сказать про перечисления. 14. Ввиду того что переменные являются одним из самых важных аспектов любого языка программирования, глубокое понимание сути декларации переменной и обращения к ней оказывается исключительно важным для создания ясного и надежного программного кода. Выбор имен для переменных важен, как и важно точно знать, к какой переменной относится то или иное имя. ИДЕНТИФИКАТОРЫ Идентификатор - это имя, под которым известна переменная или функция. В JavaScript для идентификатора допустима любая комбинация букв, цифр, знаков подчеркивания и знаков доллара. Единственным формальным ограничением для идентификаторов является то, что они не должны соответствовать никаким зарезервированным или ключевым словам JavaScript и что первый символ не может быть цифрой. Ключевыми словами языка JavaScript являются, например, string, Object, return, for или while. Зарезервированными называются слова, которые могут стать ключевыми в будущем. Список зарезервированных и ключевых слов имеется в приложении В. ВЫБОР ИМЕН ДЛЯ ПЕРЕМЕННЫХ Одним из важнейших этапов создания ясного и понятного программного кода является выбор подходящих имен для переменных. Необоснованно длинных и непонятных идентификаторов следует избегать. Хотя JavaScript позволяет давать переменным имена наподобие _$0_$, на практике эта идея оказывается плохой. Использовать знаки доллара в идентификаторах настоятельно не рекомендуется - их предполагается использовать для программного кода, генерируемого автоматически, что не поддерживалось до версии JavaScript 1.2. Несмотря на общераспространенную практику, начинать идентификатор со знака подчеркивания - тоже не слишком хорошая идея. Внутренние переменные интерпретатора часто начинаются с двух знаков подчеркивания, поэтому подобная практика может привести к недоразумениям. Имя должно давать некоторую информацию о цели использования переменной (или значения), не вытекающей непосредственно из контекста. Например, следующие идентификаторы нельзя считать удачными: var_ = 10; var x= "George Washington"; var foobar = 3.14159; var howMuchltCostsPerltemlnUSDollarsAndCents = "$1.25"; Более подходящими будут var index = 10; var president = "George Washington"; var pi = 3.14159; var price = "$1.25"; Следует использовать подходящие имена и для составных типов. Например, var anArray = ["Пн", "Вт", "Ср", "Чт", "Пт"]; будет не лучшим выбором для идентификатора данного массива. Позже, при ссылках на элементы массива, будет не очень понятно, что может означать anAr ray [ 3 ]. Лучше использовать var weekdays = ["Пн", "Вт", "Ср", "Чт", "Пт"]; Тогда в дальнейшем weekdays [3] позволит пользователю догадаться о содержимом указанного элемента массива. То же самое касается и имен функций. Суммирующую функцию можно назвать и calc (), но лучше назвать ее sumAll (). ПРОПИСНЫЕ БУКВЫ Поскольку JavaScript чувствителен к регистру символов, weekdays и weekDays обозначают две различные переменные. По этой причине нецелесообразно выбирать слишком похожие идентификаторы. Точно так же нецелесообразно выбирать идентификаторы, похожие на имена общедоступных объектов или свойств. Это может привести к недоразумениям и даже к ошибкам. Важную роль в соглашениях по выбору имен играет использование прописных букв. Программисты, работающие с JavaScript, с готовностью применяют "криволинейный" стиль для имен переменных. В соответствии с этим стилем каждое слово в имени переменной, кроме первого, пишется с прописной буквы. Например, переменную, хранящую цветовое значение для текста основной части документа, можно назвать bodyTextColor. Это согласуется с тем, как называются свойства объектов браузера, поэтому программистам, не имеющим большого опыта работы, настоятельно рекомендуется использовать именно такой подход. КОРОТКИЕ ИМЕНА ПЕРЕМЕННЫХ Программисты, работающие с JavaScript, часто используют очень короткие имена переменных, наподобие х, чтобы уменьшить число символов, которые необходимо передавать клиенту. Причина в том, что уменьшение числа символов для пересылки ведет к уменьшению времени загрузки. Но, хотя конечный пользователь может и заметить некоторую разницу во времени загрузки для очень больших сценариев, в сравнении с размером типичных изображений, имеющихся на страницах Web сегодня, несколько сотен символов, сэкономленных путем использования коротких имен переменных, почти ничего не дает. Кроме того, код JavaScript, лишенный комментариев и информативных имен, очень труден для расшифровки. Хотя это можно делать и преднамеренно, если вы не хотите, чтобы кто-то читал и понимал ваш программный код. Но это совсем нежелательно, если предполагается, что кому-то придется поддерживать или корректировать ваши сценарии. Можно решить и обе указанные задачи, если перед тем как поместить сценарий на Web-страницу, выполнить "сжатие" JavaScript с помощью любого из множества имеющихся в наличии автоматизированных средств. Тогда, как и в случае любого программного кода, вы должны сохранить свои оригинальные сценарии в удобной для чтения форме, а с помощью сжатия создать более быстрые и малопонятные версии кода JavaScript для вашего узла. Одним из подходящих средств автоматизации решения этой задачи является программа W3Compiler, которую можно найти на страницах узла www.w3compiler.com. |