Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 822 / 20 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 5:

Скрипты

5.3. ECMAScript, редакция 3

В этом разделе описываются особенности языка JavaScript, соответствующие стандарту ECMAScript. Расширения рассматриваются в следующем разделе. Затем будут рассматриваться объекты, предоставляемые базовым программным обеспечением и не предусмотренные стандартом.

5.3.1. Синтаксис

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

JavaScript-скрипты Mozilla хранятся как обычные текстовые файлы. Содержимое этих файлов должно быть в кодировке UTF-8. Это значит, что символы из таблицы ASCII хранятся каждый в одном байте. Этого достаточно, если предпочтительный язык - английский, так как никакая особая подготовка не нужна. Можно просто пользоваться обычным текстовым редактором.

В некоторых системах задействуются и неиспользуемые значения ASCII от 128 до 255, например, для разных символов языков Западной Европы \acute{e} в слове r\acute{e}sum\acute{e}. Раньше эта традиция была удобным способом создавать текст на других языках. Но это не соответствует правилам использования UTF-8, которые требуют двух или более байтов для всех символов не из таблицы ASCII. Вставка таких 8-битных европейских символов в скрипты будет безуспешной. Символ \acute{e} правильно кодируется в UTF-8 как "é", по крайней мере, это то, что показывает простенький текстовый редактор, не знающий о UTF-8.

Но даже у корректно закодированных многобайтовых символов UTF-8 ограниченное применение. Они могут появляться только внутри строковых литералов JavaScript, в комментариях и иногда в именах переменных. Но в общем рекомендуется придерживаться в коде программы ASCII-символов; другие символы следует использовать только для данных. Для европейцев использование для имен переменных символов таблицы Latin1 в целом безопасно, если эти символы корректно закодированы в UTF-8. Чтобы узнать подробнее о поддержке Unicode, см. раздел 7.6 стандарта ECMA-262, редакция 3, или раздел 5.16 стандарта Unicode 3.0.

В строках по-прежнему можно работать с любыми Unicode-символами. Подробнее об этом рассказано в разделе "Типы данных".

5.3.1.1. Визуальное форматирование

JavaScript - язык, в котором визуальное форматирование большой роли не играет, как и XML, и C, например. Одна инструкция не обязана находиться на одной строке. В число распознаваемых пробельных символов входят собственно пробел и табуляция; в число распознаваемых символов конца строки входят символ перевода строки ( 0A в шестнадцатеричном представлении) и символ возврата каретки ( 0D в шестнадцатеричном представлении). Напомним, что в Windows, Mac OS 9 и UNIX разные представления о том, каким символом должна завершаться строка. Это не влияет на интерпретацию скриптов, но на некоторых системах может заметно усложнить правку кода.

Комментарии в JavaScript пишутся в C-стиле. Поддерживаются как однострочные комментарии:

// Однострочный комментарий

так и многострочные:

/* комментарий на
   несколько строк */

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

5.3.1.2. Инструкции

Кирпичики, из которых строятся скрипты JavaScript, - инструкции. Инструкция может завершаться точкой с запятой, но это не обязательно. Есть только один случай, когда точки с запятой обязательны - между тремя выражениями инструкции for(;;). В остальных случаях интерпретатор автоматически будет предполагать, что точка с запятой поставлена, даже если ее на самом деле нет. Следующие три инструкции эквивалентны:

x = 5;
x = 5
x = 5 // несмотря на комментарий, эта инструкция эквивалентна предыдущей

Возможность опускать точку с запятой нужна для того, чтобы упростить задачу разработчикам, привыкшим к стилю Visual Basic. Тем не менее, рекомендуется всегда использовать точку с запятой. Дело не только в том, что текст так становится понятнее, но и в том, что в будущих версиях JavaScript это может стать необходимостью.

Скриптам не нужна процедура main() или что-то подобное ей. Как и в Perl, инструкции могут появляться вне функций и объектов начиная с первой строки. В JavaScript также допустима инструкция, не делающая ничего:

;

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

{ x = 5; y= 5; }

В этой лекции инструкция означает или одиночную инструкцию, завершающуюся точкой с запятой, или составную инструкцию без конечной точки с запятой.

5.3.1.3. Типы данных

В JavaScript поддерживаются следующие собственные типы данных:

Undefined Null Boolean Number String Object

Существует также скрытый безымянный тип данных, соответствующий 32- битным беззнаковым целым.

В JavaScript типы ассоциируются с элементами данных, а не со структурами, хранящими эти данные (например, переменными). Можно привести очень старую аналогию между переменными в программе и коробками для обуви. По этой аналогии элемент данных соответствует паре ботинок, а структура, хранящая ее (переменная) - обувной коробке. В JavaScript информация о типе связывается с ботинками, вы не найдете ее в коробке. Переменные, хранящие данные типа Boolean, Number или String, подразумевают обувную коробку, в которой находится единственная пара ботинок определенного типа. Тип Object подразумевает коробку, в которой может быть много пар, связанных вместе. Тип Null подразумевает пустую коробку, а тип Undefined используется для коробки с неопределенным содержимым.

Для определения типов можно пользоваться оператором typeof. Для обычных данных JavaScript он вернет одну из следующих строк, также он может вернуть другую строку, если тип данных определен в базовом ПО:

"undefined" "boolean" "number" "string" "object" "function"

При этом если тип данных - Null, возвращается "object". Давайте по очереди рассмотрим все эти типы.

Тип данных Undefined допускает только одно значение (неопределенное), но литеральная константа для него отсутствует. У глобального объекта (см. ниже) есть единственное свойство с именем undefined, содержащим это значение. При необходимости это значение можно генерировать с помощью оператора void или с помощью undefined:

x = void 0;
X = undefined;

Тип Null допускает только одно значение: пустое. Существует литерал null, который может использоваться для опустошения переменной или в сравнениях:

x = null;

Тип Boolean допускает два значения: истина и ложь. Литералами для этих значений будут true и false соответственно. false не эквивалентен 0, как в C, но преобразование между этими двумя значениями настолько незаметно, что мелкие различия обычно можно не учитывать.

x = true;

Тип Number позволяет хранить 64-битные двойной точности числа с плавающей запятой в соответствии со стандартом IEEE 754. Этот стандарт не распространяется свободно, но почти идентичный ему черновик можно найти по адресу http://www.validlab.com/754R/.

Числа с плавающей запятой - попытка представить действительные числа, но это представление неточное. Если математические операции не вводят дальнейших погрешностей, такое представление точно для чисел до 15 разрядов. Стандарт IEEE 754 допускает значения "не число" (Not-a- Number, возможный результат от деления на нуль или взятия арксинуса от 2) и бесконечные значения (появляющиеся, возможно, при переполнении). Чтобы проверить, не является ли ваше число таким особым значением, можно воспользоваться методами isNaN() и isFinite() соответственно. В JavaScript для этих значений литералов нет, но у глобального объекта есть свойства NaN и Infinity, кроме того, у объекта Math имеется несколько других полезных свойств:

POSITIVE_INFINITY NEGATIVE_INFINITY NaN MAX_VALUE MIN_VALUE

Эти свойства можно использовать в сравнениях. Для литералов чисел с плавающей запятой поддерживается экспоненциальное представление до примерно +/-10AAAAAAAA:

x = -3.141592654; y = 1.0e+23; z = 234.555555E-100;

Числа также можно записывать в шестнадцатеричном виде, указывая префикс 0x или 0X, за которым должны следовать цифры от 0 до 9 и буквы от A до F в любом регистре.

x = 0xFEFF;

Метод сравнивания нечисловых значений ( NaN ) в JavaScript соответствует рекомендациям IEEE 754, но уникальные идентификаторы для различных нечисловых значений IEEE 754 в языке ECMAScript не предусмотрены.

Так как числа с плавающей запятой неточны и часто вызывают ошибки, это не лучший выбор для счетчиков и индексов. Для таких общих задач оптимально использовать целые числа. В интерпретаторе JavaScript Mozilla данные типа Number на самом деле хранятся как 31-битные знаковые целые, пока не появится действительная необходимость в точности нецелых чисел. Итог таков: если избегать деления и пользоваться числами меньше 46000 (квадратный корень из 2AAAA), почти все простые вычисления в JavaScript будут выполняться с использованием точной целочисленной арифметики, и можно будет избежать погрешностей нецелых чисел. Эти целые числа также достаточно велики, чтобы хранить любое значение Unicode и любое значение цвета CSS 2 в формате RGB (Red-Green-Blue, красный-зеленый-синий).

Но в некоторых ситуациях значение может на самом деле храниться как нецелое число. Вот несколько примеров: если это число с десятичной точкой; если в результате деления получается остаток; если вызывается функция, результат которой - действительное число (например, sin() ); или если в результате вычислений получается число, большее 2AAAA). Во всех остальных случаях данные типа Number хранятся как целые.

Если число преобразовывается из целого в нецелое, погрешности, связанные с новым представлением, могут проявиться не сразу. Стандарт IEEE 754 предусматривает 51-битную точность представления нецелых чисел, чего обычно достаточно, если только не требуются интенсивные и многократные вычисления.

Тип String представляет последовательность символов Unicode, хранящихся в кодировке UTF-16 (то есть по два байта на каждый символ). Каждая строка неизменяема, как и в Java; сходу выполнять операции над строками, как в C, нельзя. Строковые литералы помещаются между парой одиночных или двойных кавычек. Для распространенных непечатаемых символов может использоваться специальное представление. Оно появилась под влиянием нотации для специальных символов в C-строках. Вот ее версия для JavaScript:

\b \t \n \v \f \r \" \' \\ and \x и \u

Выше представлены соответственно символы забоя, табуляции, перевода строки, вертикальной табуляции, перевода страницы, возврата каретки, двойной кавычки, одиночной кавычки, обратной наклонной черты и начальные комбинации для шестнадцатеричного и Unicode-представления символов. При использовании шестнадцатеричного представления числа за указанной последовательностью должны идти две шестнадцатеричные цифры, которые соответствуют позиционному коду (индексу) символа Unicode, находящемуся в диапазоне от 0 до 255. В этот диапазон включаются символы ASCII и символ неразрывного пробела ( 0xA0 ). Сюда также входят символы ISO 8859 (Latin 1 - европейские). При использовании Unicode- представления символа за указанной последовательностью должны идти четыре шестнадцатеричные цифры, которые соответствуют любому символу Unicode, который только можно вообразить. Вот простой пример:

str = "hello, world\n";

Тип Object будет рассматриваться в отдельном разделе, посвященном только ему.

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