1 (1119426), страница 5
Текст из файла (страница 5)
Если в тексте константынужно указать кавычку, то она предваряется экранирующим символом \(“Пример строки с кавычками:\”, \'”) . Если в тексте нужноуказать экранирующий символ, то он дублируется (“\\”).Операции над строковым типом включают в себя конкатенацию (+)и шесть операций сравнения (==, !=, <, >, <=, >=). Используется обычноелексикографическое сравнение строк .Числовой тип данных содержит как целые, так и вещественныезначения.
Для записи целочисленных констант используется десятичноепредставление (124, -13 и т.д.). Для записи вещественных константиспользуется либо представление с дробной частью, отделенной точкой25(12.345), либо преставление в виде «мантисса-порядок» (1.2E2, -0.5e-3).Используется десятичное представление, порядок отделяется латинскойбуквой E (e).Операции над числовым типом включают в себя арифметические,операции сравнения, инкрементные и декрементные.Арифметические операции традиционны: +, - , *, /, а также остатокот деления (%).
Также традиционны и операции сравнения (==, !=, <, >,<=, >=). Инкрементные и декрементные операции (++ и --) делятся напрефиксные и постфиксные, как в Си. Их семантика совпадает ссемантикой Си.Логический тип данных содержит две константы (true и false). Кнему применимы логические операции («и» - &&, «или» - ||, «отрицание» !) и операции сравнения (==, !=, <, >, <=, >=).Составные типы данныхMJS содержит два составных типа: массив (Array) и объект (Object).Массив — это последовательность анонимных переменных. Ккаждой переменной из этой последовательности можно обратиться пономеру (индексу):Response.write(arr[i]);Индекс в массиве начинается с нуля.Значения элементов массива могут быть заданы с помощьюконструктора массива:var a = [1,2,”string value”, false];Инициализатор может быть и пустым: b = [];Заметим, что элементы массива могут иметь разные типы (чтовытекает из динамической типизации переменных).Важнейшей особенностью массивов вMJS является их«динамичность»: размер массива может меняться во время работыпрограммы.
Добавить элемент в массив можно с помощью операцииприсваивания: если индекс для присваиваемой переменной больше числаэлементов в массиве, то массив «расширяется», чтобы включить в себяновый элемент.var a = [0,1,2,3];a[4] = 4;26При этом в массиве могут появиться дополнительные элементы (снеопределенным значением):a[20] = 20;Рассмотрим теперь объектный тип данных. Объект характеризуетсянабором именованных свойств. Доступ к свойству обеспечивает операция"точка".
У нее два аргумента — объект и идентификатор свойства: obj.id.Свойства делятся на свойства-данные и свойства-методы. Последниеявляются функциями, и их можно вызывать как функции, например:Response.write("<tag/>");Заметим, что с точки зрения интерпретатора операция доступа ксвойству имеет первым операндом ссылку на объект, а вторым операндом— идентификатор (фактически — строку). Поэтому нет ничего странного втом, что объект имеет еще одну форму операции доступа к свойству:операцию индексирования. Эта операция имеет первым аргументомссылку на объект, а вторым — строку. Например, оператор:x = obj.id;полностью эквивалентен оператору:x = obj["id"];Заметим, что в отличие от операции "точка" второй аргумент можетбыть вычисляемым, например, следующий фрагмент также присваиваетпеременной x значение свойства id объекта obj:var id = "i";x = obj[id + "d"];Таким образом, объект становится похожим на массив, толькообъектная операция индексирования имеет аргументом не число, а строку.На самом деле, объект вMJS имеет и вторую форму операциииндексирования:obj[i], где I — целочисленный индекс (от 0 до N-1, где N – свойствобъекта).
Правда, информация о том, какой именно индекс соответствуетсвойству, недоступна пользователю и зависит от реализации. Поэтомувторая форма операции индексирования используется крайне редко, тем неменее она существует.Встает резонный вопрос: если объект фактически обобщает27функциональность массива, а массив является динамически расширяемымобъектом, то почему бы не позволить набору свойств объекта также бытьрасширяемым? На самом деле, в языке JavaScript принята именно такаяинтерпретация операции индексирования, но в модельном варианте дляпростоты это не реализовано. Таким образом, пользователь в MJS неможет изменять набор свойств объекта.Более того, пользователь в MJS не может создавать свои объекты(как это можно делать в JavaScript), и набор объектов ограничен тольковстроенными объектами.Встроенные объекты MJSОбъект Response представляет собой обертку над выводом CGIпрограммы.
Он имеет единственный метод — write(x), который выводитаргумент x в стандартный вывод. Пример:Response.write("<body>");Объект Environment – это набор переменных окружения. Каждоесвойство объекта (доступное только для чтения) — это соответствующаяпеременная окружения, переданного процессу-интерпретатору. Примеры:x = Environment["QUERY_STRING"];var y = Environment.REMOTE_ADDR;Важными представителями встроенных объектов являются объектытипы. Каждому типу MJS соответствует встроенный одноименный объекттип.Отметим, что значения в языке MJS являются копиями ("клонами")соответствующих объектов-типов, поэтому свойства и методы этихобъектов являются одновременно свойствами и методами значений.Объект Boolean имеет единственный метод toString(), возвращающий"true" или "false".Объект Array имеет свойство length (количество элементов) и триметода:sort() - сортирует элементы по возрастанию;reverse() - переставляет элементы в обратном порядке;toString() - возвращает строку, содержащую список значенийэлементов, разделенных запятыми.Объект Number имеет три свойства:MAX_VALUE — максимальное значение числа;MIN_VALUE — минимальное значение числа;28NaN – это специальное значение, которое вырабатывается приошибках вычислений или преобразований.Методы объекта Number:toString([base]) — возвращает строку, представляющую значениечисла в системе счисления с основанием base (по умолчанию — 10);toFixed(n) - возвращает строку, представляющую значение числа вформе "целая_часть.дробная_часть".
Длина дробной части — n цифр;toExponential(n) - возвращает строку, представляющую значениечисла в форме "мантисса E порядок". Мантисса нормализована, длинадробной части мантиссы— n цифр;Объект String имеет свойство length (количество символов в строке)и методы (позиции символов нумеруются с нуля):charAt(позиция) - возвращает строку, состоящую из одного символа,стоящего в указанной позиции в строке (или пустую строку, если позицияневерна).indexOf(строка) - возвращает номер позиции, с которой начинаетсяпервое слева вхождение подстроки строка(или -1, если вхождения нет)lastIndexOf(строка) - возвращает номер позиции, с которойначинается первое справа вхождение подстроки строка(или -1, есливхождения нет)substr(старт [, длина]) — возвращает подстроку, начинающуюся спозиции старт, и содержащую длина символов.
Если длина не заданаили превышает возможную длину, то подстрока содержит символы доконца строки.Универсальные значения и операцииВ языке MJS существуют специальные значения, которые имеютуниверсальный характер. Это неопределенное значение undefined и пустоезначениеnull.Неопределенноезначениеполучаетлюбаянеинициализированная переменная.
Пустое значение удобно дляиндикации отсутствия значения (объекта).Также существуют универсальные операции, применимые к любымтипам данных. Главная такая операция — это присваивание:v=eЛевая часть операции — переменная или свойство объекта(доступное для записи), правая часть — выражение. Значение левой частиприсваивается правой части, а также служит результатом операцииприсваивания. Операция присваивания — правоассоциативна.Кроме обычной операции присваивания в MJS по аналогии с языкомСи++ существуют варианты операции присваивания для ряда бинарныхинфиксных операций. В языке MJS это операции +=, -=, *=, /=, *=, %=. Ихсемантика совпадает с семантикой операций Си++.29Другая универсальная операция — это проверка на строгуютождественность (===).
Она истинна, только если объекты имеют один итот же тип и значение. Обычная операция сравнения сравнивает толькозначения, а если типы не совпадают, то происходит преобразование типов(см.ниже) к одному, а затем только проверка. Поэтому сравнение 1==="1"ложно, а сравнение 1=="1" истинно.Операция проверки на нетождественность (!==) является отрицаниемоперации (===).Последняя универсальная операция MJS — это операцияопределения типа typeof. Она возвращает строку, идентифицирующую типаргумента.
Конкретные значения определяются таблицей 1.Таблица 1. Значения, возвращаемые операцией typeofТипЗначениеНеопределенный (undefined)"undefined"Пустой(null)"Object"Логический"Boolean"Числовой"Number"Строковый"String"Объектный"Object"Преобразования типовВажной особенностью языка MJS является широкое использованиенеявных преобразований типов. Фактически интерпретатор MJS пытаетсявыполнить операцию практически для любой комбинации типовоперандов. Например, если операция требует числовых операндов(пример: a-b), то оба операнда (если нужно) преобразуются к типу Number.Примечательным исключением является операция +.
Она можетприменяться как к числовым, так и к строковым данным. При этомстроковая операция имеет приоритет, поэтому если один из операндов —строковый, то другой преобразуется в строку. Поэтому оба оператора нижедадут одно и то же строковое значение "1234":x = 12 + "34";y = "12" + 34;Следующие ниже таблицы описывают правила преобразованиятипов.30Таблица 2. Преобразования к логическому типуТипЗначениеНеопределенный (undefined)falseПустой(null)falseЧисловойfalse, если значение=0, true иначеСтроковыйfalse, если длина строки=0, trueиначеДругие объектыtrueТаблица 3.
Преобразования к числовому типуТипЗначениеНеопределенный (undefined)Number.NaNПустой(null)0Логический0, если значение=false, 1 иначеСтроковыйЕсли строка представляет собойчисловуюконстанту,тосоответствующее значение. Иначе— Number.NaNДругие объектыNumber.NaNТаблица 4. Преобразования к строковому типуТипЗначениеНеопределенный (undefined)"undefined"Пустой(null)"null"Логический"true" или "false"Числовой"NaN" или строка, представляющаячисловое значениеДругие объектызначение,toString()31возвращаемоеметодомСинтаксис MJS<предложение> ::= <определение-функции> | <оператор><определение-функции>::=function <имя>([<имя>] {,<имя>}) <блок><оператор>::= <объявление-переменной> | <пустой-оператор> | <блок> |<условный-оператор> | <оператор-цикла> |<оператор-перехода> | <оператор-выражение><объявление-переменной>::=var <имя> [=<выражение>] {, <имя> [=<выражение>]};<пустой-оператор>::= ;<блок> ::= { <оператор>{<оператор>}}<условный-оператор>::= if (<выражение>) <оператор> [ else <оператор>]<оператор-цикла>::= while (<выражение>) <оператор> |for ([<выражение>];[<выражение>];[<выражение>]) <оператор> |do <оператор> while (<выражение>); |for ([var] <имя> in <выражение>) <оператор><оператор-перехода>::= break; | continue; | return [<выражение>];<оператор-выражение>::=<выражение>;Большинство операторов языка MJS соответствует операторам языкаСи++.
Исключение составляет цикл for- in. Его аналога в языке Си++ нет.Этот цикл служит для последовательного просмотра элементов в массивеили свойств в объекте. Переменная цикла получает на каждой итерациизначение очередного элемента массива или свойства объекта (вспомним,что в MJS существует глубокая связь между массивами и объектами). Еслипеременная объявлена (через var) в цикл, то ее область действия — толькооператор цикла, и после выхода из него переменная не существует.Следующий оператор цикла суммирует все элементы массива arr:var s = 0;for (var e in arr) s+=e;Операторы break и continue могут появляться только внутри телацикла (произвольного). Оператор return может появляться только внутритела функции.
Еслиreturn не возвращает выражение, то функцияявляется процедурой (в терминах языка Паскаль). Однако, если контекствызова такой функции требует возврата значения (например,x=f()), то этозначение равно Undefined. Таким образом можно считать, что returnвсегда возвращает значение, по умолчанию равное Undefined.32СПИСОК ЛИТЕРАТУРЫ1. Б. Страуструп. Язык программирования С++. Специальное издание. М.; СПб.: «Издательство БИНОМ» - «Невский Диалект», 2001 г.2. RFC3986.