Глава 3.12. Встроенные объекты Error, Math и RegExpВ этой главе приведены описания встроенных объектов Error, Math и RegExp. 3.12.1. Исключения: объект ErrorОбъекты Error создаются при возникновении ошибок в процессе выполнения сценария и содержат информацию об ошибке, которая используется операторами обработки исключений. К сожалению, реализации этого класса объектов не вполне соответствуют стандарту, поэтому мы сначала описываем объект Error согласно ECMAScript, а затем его реализацию в JScript (JavaScript, реализованный в обозревателях Netscape, вообще не поддерживает объекты Error). 3.12.1.1. Объект Error в ECMAScriptВсе исключения подразделяются на системные и пользовательские. Системные исключения генерируются исполняющей системой в процессе выполнения сценария, пользовательские самим сценарием с помощью оператора throw. Стандарт ECMAScript предусматривает следующие виды системных исключений:
Объекты Error соответственно также могут быть созданы
исполняющей системой или сценарием. Конструктор пользовательского объекта Error
имеет вид
Свойство messageСинтаксис: объект.message Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства message является сообщение об ошибке данного объекта. Это свойство является свойством объекта по умолчанию. Свойство nameСинтаксис: объект.name Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства name является название данного объекта. В пользовательских объектах оно содержит строку "Error", а в системных объектах строку, содержащую тип исключения согласно Таблицы 3.9. 3.12.1.2. Объект Error в JScriptВ JScript, реализованном в обозревателях Internet Explorer 5.x, объект Error
имеет нестандартный конструктор Для совместимости с ECMAScript объект Error в Internet Explorer 5.5 получил свойства message и name. При этом свойство message является синонимом свойства description, а name соответствует приведенному выше описанию. Пример генерации исключения в JScript и вывода информации о нем: function showErrorInfo(e) { document.write(e, ":<BR>"); document.write("Источник ошибки: ", (e.number >> 16) & 0x1FFF, "<BR>"); document.write("Номер ошибки: ", e.number & 0xFFFF, "<BR>"); document.write("Описание ошибки: ", e.description); } var x; try { x = y; // Ошибка: переменная y не определена } catch (e) { // Создает локальный объект e класса Error showErrorInfo(e); } Этот сценарий выведет на экран: [object Error]: 3.12.2. Математические функции и константы: объект MathОбъект Math обеспечивает доступ к различным математическим константам и функциям. Он существует в единственном экземпляре и потому не имеет конструктора. Соответственно все его свойства и методы являются статическими и должны вызываться обращением к объекту Math, а не его реализациям. Прототипа объект Math не имеет.
Свойство EСинтаксис: Math.E Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства E является основание натуральных логарифмов e, которое
приблизительно равно 2.718281828459045. Пример: Свойство LN10Синтаксис: Math.LN10 Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства LN10 является натуральный логарифм числа 10 (ln 10), который
приблизительно равен 2.302585092994046. Пример: Свойство LN2Синтаксис: Math.LN2 Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства LN2 является натуральный логарифм числа 2 (ln 2), который
приблизительно равен 0.6931471805599453. Пример: Свойство LOG10EСинтаксис: Math.LOG10E Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства LOG10E является десятичный логарифм числа e (lg e), который
приблизительно равен 0.4342944819032518. Пример: Свойство LOG2EСинтаксис: Math.LOG2E Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства LOG2E является двоичный логарифм числа e (log2e),
который приблизительно равен 1.4426950408889634. Пример: Свойство PIСинтаксис: Math.PI Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства PI является число π (отношение длины окружности к диаметру
круга), которое приблизительно равно 3.1415926535897932. Пример: Свойство SQRT1_2Синтаксис: Math.SQRT1_2 Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства SQRT1_2 является квадратный корень из 1/2, который приблизительно
равен 0.7071067811865476. Пример: Свойство SQRT2Синтаксис: Math.SQRT2 Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства SQRT2 является квадратный корень из 2, который приблизительно
равен 1.4142135623730951. Пример: Метод absСинтаксис: Math.abs(число) Аргументы: число числовое выражение Результат: числовое значение Метод abs возвращает абсолютную величину числа. Примеры: var x = Math.abs(2); // x равно 2 var x = Math.abs(-2); // x равно 2 Метод acosСинтаксис: Math.acos(число) Аргументы: число числовое выражение Результат: числовое значение Метод acos возвращает арккосинус числа. Если число находится в диапазоне от -1 до 1 включительно, то результат находится в диапазоне от 0 до π. В противном случае результат равен NaN. Примеры: var x; with (Math) { x = acos(-1); // x равно 3.141592653589793 x = acos(0); // x равно 1.5707963267948965 x = acos(1); // x равно 0 x = acos(2); // x равно NaN } Метод asinСинтаксис: Math.asin(число) Аргументы: число числовое выражение Результат: числовое значение Метод asin возвращает арксинус числа. Если число находится в диапазоне от -1 до 1 включительно, то результат находится в диапазоне от -π/2 до +π/2. В противном случае результат равен NaN. Примеры: var x; with (Math) { x = asin(-1); // x равно -1.5707963267948965 x = asin(0); // x равно 0 x = asin(1); // x равно 1.5707963267948965 x = asin(2); // x равно NaN } Метод atanСинтаксис: Math.atan(число) Аргументы: число числовое выражение Результат: числовое значение Метод atan возвращает арктангенс числа. Результат находится в диапазоне от -π/2 до +π/2. Примеры: var x; with (Math) { x = atan(-Infinity); // x равно -1.5707963267948965 x = atan(0); // x равно 0 x = atan(Infinity); // x равно 1.5707963267948965 } Метод atan2Синтаксис: Math.atan2(число1, число2) Аргументы: число1, число2 числовые выражения Результат: числовое значение Метод atan2 возвращает арктангенс частного от деления числа1 на число2. Результат находится в диапазоне от -π до +π и соответствует величине угла в радианах между осью абсцисс и вектором до точки с координатами (число2, число1). Примеры: var x; with (Math) { x = atan2(-0, -1); // x равно -3.141592653589793 x = atan2(-1, 0); // x равно -1.5707963267948965 x = atan2(0, 1); // x равно 0 x = atan2(1, 1); // x равно 0.7853981633974483 x = atan2(1, 0); // x равно 1.5707963267948965 x = atan2(0, -1); // x равно 3.141592653589793 } Метод ceilСинтаксис: Math.ceil(число) Аргументы: число числовое выражение Результат: числовое значение Метод ceil возвращает наименьшее целое число, большее или равное числа. Примеры: var x = Math.ceil(-2.95); // x равно -2 var x = Math.ceil(2.95); // x равно 3 Метод cosСинтаксис: Math.cos(число) Аргументы: число числовое выражение Результат: числовое значение Метод cos возвращает косинус числа. Результат находится в диапазоне от -1 до +1. Примеры: var x; with (Math) { x = cos(0); // x равно 1 x = cos(PI/2); // x равно 6e-17 (почти 0) x = cos(PI); // x равно -1 } Метод expСинтаксис: Math.exp(число) Аргументы: число числовое выражение Результат: числовое значение Метод exp возвращает экспоненту числа (eчисло, где е основание натуральных логарифмов). Если число больше 709.78, то возвращается Inifinity. Пример: var x = Math.exp(1); // x равно 2.718281828459045 Метод floorСинтаксис: Math.floor(число) Аргументы: число числовое выражение Результат: числовое значение Метод floor возвращает наибольшее целое число, меньшее или равное числа. Примеры: var x = Math.floor(-2.95); // x равно -3 var x = Math.floor(2.95); // x равно 2 Метод logСинтаксис: Math.log(число) Аргументы: число числовое выражение Результат: числовое значение Метод log возвращает натуральный логарифм числа. Если число отрицательно, то возвращается NaN. Примеры: var x = Math.log(Math.E); // x равно 1 var x = Math.log(0); // x равно -Infinity var x = Math.log(-1); // x равно NaN Метод maxСинтаксис: Math.max(число1, , числоN) Аргументы: число1, , числоN числовые выражения Результат: числовое значение Поддержка: Соответствует стандарту. Возвращает большее из значений первых двух аргументов, остальные аргументы игнорируются. Если аргументов меньше двух, возвращает NaN. Метод max возвращает наибольшее из значений своих аргументов. Если аргументы не заданы, то он возвращает -Inifinity. Например, следующий сценарий document.write(Math.max(1, 2, 3)); выведет на экран Internet Explorer число 3, а на экран Netscape Navigator число 2. Метод minСинтаксис: Math.min(число1, , числоN) Аргументы: число1, , числоN числовые выражения Результат: числовое значение Поддержка: Соответствует стандарту. Возвращает меньшее из значений первых двух аргументов, остальные аргументы игнорируются. Если аргументов меньше двух, возвращает NaN. Метод min возвращает наименьшее из значений своих аргументов. Если аргументы не заданы, то он возвращает Inifinity. Например, следующий сценарий document.write(Math.min(3, 2, 1)); выведет на экран Internet Explorer число 1, а на экран Netscape Navigator число 2. Метод powСинтаксис: Math.pow(число1, число2) Аргументы: число1, число2 числовые выражения Результат: числовое значение Метод pow возвращает число1, возведенное в степень число2 (число1число2). Примеры: var x; with (Math) { x = pow(2, 3); // x равно 8 x = pow(100, 0); // x равно 1 x = pow(10, 0.5); // x равно 3.162277660168379 } Метод randomСинтаксис: Math.random() Результат: числовое значение Метод random генерирует случайное число в диапазоне от 0 включительно до 1
исключительно. Пример: Метод roundСинтаксис: Math.round(число) Аргументы: число числовое выражение Результат: числовое значение Метод round округляет число до ближайшего целого числа и возвращает его. Примеры: var x; with (Math) { x = round(2.49); // x равно 2 x = round(2.5); // x равно 3 x = round(-2.5); // x равно -2 x = round(-2.51); // x равно -3 } Метод sinСинтаксис: Math.sin(число) Аргументы: число числовое выражение Результат: числовое значение Метод sin возвращает синус числа. Результат находится в диапазоне от -1 до +1. Примеры: var x; with (Math) { x = sin(0); // x равно 0 x = sin(PI/2); // x равно 1 x = sin(PI); // x равно 1e-16 (почти 0) } Метод sqrtСинтаксис: Math.sqrt(число) Аргументы: число числовое выражение Результат: числовое значение Метод sqrt возвращает квадратный корень из числа. Если число отрицательно, то возвращается NaN. Примеры: var x = Math.sqrt(2); // x равно 1.4142135623730951 var x = Math.sqrt(1); // x равно 1 var x = Math.sqrt(-1); // x равно NaN Метод tanСинтаксис: Math.tan(число) Аргументы: число числовое выражение Результат: числовое значение Метод tan возвращает тангенс числа. Примеры: var x; with (Math) { x = tan(0); // x равно 0 x = tan(PI/2); // x равно 16331778728383844 x = tan(PI); // x равно -1e-16 (почти 0) } 3.12.3. Регулярные выражения: объект RegExpОбъект RegExp используется для создания регулярных выражений, подробно описанных в гл. 3.5. Там же описаны способы создания этих объектов. Все описанные ниже свойства объекта RegExp являются статическими. Это означает, что они хранятся в единственном экземпляре и изменяются при каждой операции сопоставления с регулярным выражением.
Свойства $1, , $9Синтаксис: RegExp.$n Атрибуты: { DontEnum, DontDelete, ReadOnly } Если часть регулярного выражения заключена в круглые скобки, то соответствующая ей подстрока запоминается для последующего использования. Значениями свойств $1, , $9 являются подстроки исходной строки, которые были запомнены в процессе последнего сопоставления с образцом. Регулярное выражение может содержать любое количество выражений в круглых скобках, но в объекте RegExp запоминаются только последние девять найденных соответствий. Пример: следующий сценарий var re = new RegExp("(\\d*)\\s*(\\d*)","ig"); var arr = re.exec("111 2222 33333"); var s = "$1 = '" + RegExp.$1 + "' "; s += "$2 = '" + RegExp.$2 + "' "; s += "$3 = '" + RegExp.$3 + "'"; document.write(s); выведет на экран обозревателя текст $1 = '111' $2 = '2222' $3 = ''. Эти свойства объекта RegExp являются статическими и изменяются при каждой операции сопоставления с регулярным выражением. В методе String.replace они употребляются без имени объекта RegExp. См. пример в п. 3.5.4. Свойства $01, , $99Синтаксис: RegExp.$nn Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживаются с версии 5.5. Не поддерживаются. Если часть регулярного выражения заключена в круглые скобки, то соответствующая ей подстрока запоминается для последующего использования. Значениями свойств $01, , $99 являются подстроки исходной строки, которые были запомнены в процессе последнего сопоставления с образцом. Регулярное выражение может содержать любое количество выражений в круглых скобках, но в этих свойствах запоминаются только последние 99 найденных соответствий. Пример: следующий сценарий var re = new RegExp("(\\d*)\\s*(\\d*)","ig"); var arr = re.exec("111 2222 33333"); var s = "$01 = '" + RegExp.$01 + "' "; s += "$02 = '" + RegExp.$02 + "' "; s += "$03 = '" + RegExp.$03 + "'"; document.write(s); выведет на экран обозревателя текст $01 = '111' $02 = '2222' $03 = ''. Эти свойства объекта RegExp являются статическими и изменяются при каждой операции сопоставления с регулярным выражением. В методе String.replace они употребляются без имени объекта RegExp. См. пример в п. 3.5.4. Свойство globalСинтаксис: регвыр.global Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства global является значение опции "g" (глобальный поиск), заданное при создании объекта регвыр. Например, следующий сценарий var re = new RegExp("a+b+c","ig"); document.write(re.global); выведет на экран обозревателя текст true. Свойство ignoreCaseСинтаксис: регвыр.ignoreCase Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства ignoreCase является значение опции "i" (не различать строчные и прописные буквы), заданное при создании объекта регвыр. Например, следующий сценарий var re = new RegExp("a+b+c","ig"); document.write(re.ignoreCase); выведет на экран обозревателя текст true. Свойство inputСинтаксис: RegExp.input Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства input является последняя исходная строка, к которой применялось сопоставление с образцом. Это свойство объекта RegExp является статическим и изменяется при каждой операции сопоставления с регулярным выражением. Пример: следующий сценарий var re = new RegExp("\\d+", "g"); var arr = re.exec("111 2222 33333"); document.write(RegExp.input); выведет на экран обозревателя текст 111 2222 33333. Свойство lastIndexСинтаксис: регвыр.lastIndex Атрибуты: { DontEnum, DontDelete } Значением свойства lastIndex является целое число, содержащее номер элемента строки, с которого начнется следующее сопоставление с образцом. При создании объекта регвыр этому свойству присваивается значение 0. Оно используется только в тех случаях, когда включена опция глобального поиска (т. е. свойство global имеет значение true). Пример: var re = /(aha)/g; var a = re.exec("aha"); // a равно ["aha", "aha"], re.lastIndex равно 3 var a = re.exec("aha"); // a равно [""], re.lastIndex по-прежнему равно 3 re.lastIndex = 0; // повторить поиск var a = re.exec("aha"); // a равно ["aha", "aha"], re.lastIndex равно 3 Свойство lastMatch ($&)Синтаксис: RegExp.lastMatch Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживается с версии 5.5. Поддерживается с версии 4.0. Значением свойства lastMatch является последняя найденная подстрока исходной строки. Это свойство объекта RegExp является статическим и изменяется при каждой операции сопоставления с регулярным выражением. Пример: следующий сценарий var re = new RegExp("\\d+", "g"); var arr = re.exec("111 2222 33333"); document.write(RegExp.lastMatch); выведет на экран обозревателя текст 111. Свойство lastParen (&+)Синтаксис: RegExp.lastParen Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживается с версии 5.5. Поддерживается с версии 4.0. Значением свойства lastParen является последняя запомненная подстрока исходной строки, соответствующая подвыражению регулярного выражения, заключенному в круглые скобки. Это свойство объекта RegExp является статическим и изменяется при каждой операции сопоставления с регулярным выражением. Пример: следующий сценарий var re = new RegExp("(\\d+) (\\d+)", "g"); var arr = re.exec("111 2222 33333"); document.write(RegExp.lastParen); выведет на экран обозревателя текст 2222. Свойство leftContext (&`)Синтаксис: RegExp.leftContext Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживается с версии 5.5. Поддерживается с версии 4.0. Значением свойства leftContext является подстрока исходной строки, предшествующая последней найденной подстроке. Это свойство объекта RegExp является статическим и изменяется при каждой операции сопоставления с регулярным выражением. Пример: следующий сценарий var arr = / (\d+)/.exec("111 2222 33333"); document.write(RegExp.leftContext + "|" + RegExp.lastMatch + "|" + RegExp.rightContext); выведет на экран обозревателя текст 111| 2222| 33333. Свойство multiline ($*)Синтаксис: регвыр.multiline Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживается с версии 5.5. Поддерживается с версии 4.0. Значением свойства multiline является значение опции "m" (многострочный поиск), заданное при создании объекта регвыр. Например, следующий сценарий var re = new RegExp("a+b+c","im"); document.write(re.ignoreCase); выведет на экран обозревателя текст true. В обозревателях Netscape опция "m" не поддерживается, а свойство multiline
является статическим свойством объекта RegExp. Мы можем присваивать ему логическое
значение, которое включает или выключает многострочный поиск для всех регулярных выражений,
например Свойство rightContext (&')Синтаксис: RegExp.rightContext Атрибуты: { DontEnum, DontDelete, ReadOnly } Поддержка: Поддерживается с версии 5.5. Поддерживается с версии 4.0. Значением свойства rightContext является подстрока исходной строки, следующая за последней найденной подстрокой. Это свойство объекта RegExp является статическим и изменяется при каждой операции сопоставления с регулярным выражением. Пример: следующий сценарий var arr = / (\d+)/.exec("111 2222 33333"); document.write(RegExp.leftContext + "|" + RegExp.lastMatch + "|" + RegExp.rightContext); выведет на экран обозревателя текст 111| 2222| 33333. Свойство sourceСинтаксис: регвыр.source Атрибуты: { DontEnum, DontDelete, ReadOnly } Значением свойства source является строка, содержащая регулярное выражение, заданное при создании объекта регвыр. Например, следующий сценарий var re = new RegExp("a+b+c","ig"); document.write(re.source); выведет на экран обозревателя текст a+b+c. Метод compileСинтаксис: регвыр.compile(образец, опции?) Аргументы: образец регулярное выражение опции необязательные опции поиска Метод compile компилирует образец во внутренний формат хранения, что в дальнейшем ускоряет сопоставление с этим образцом. Компиляция регулярного выражения имеет смысл, если вы собираетесь использовать это выражение несколько раз. Пример: var r = new RegExp("[A-Z]", "g"); r.compile("[a-z]", "g"); Метод execСинтаксис: регвыр.exec(строка) Аргументы: строка любое строковое выражение Результат: массив результатов или null Метод exec выполняет сопоставление строки с образцом, заданным регвыр. Если сопоставление с образцом закончилось неудачей, то возвращается значение null. В противном случае результатом является массив подстрок, соответствующих заданному образцу. В процессе сопоставления производится обновление всех свойств объекта регвыр (и тем самым всех свойств объекта RegExp). Результирующий массив имеет следующие свойства:
Пример: следующий сценарий var arr = /(\d+)\.(\d+)\.(\d+)/.exec("Я родился 21.05.1958"); document.write("Дата рождения: ", arr[0], "<br>"); document.write("День рождения: ", arr[1], "<br>"); document.write("Месяц рождения: ", arr[2], "<br>"); document.write("Год рождения: ", arr[3], "<br>"); выведет на экран обозревателя текст: Дата рождения: 21.05.1958 Включение в регулярное выражение опции глобального поиска позволяет многократно применять этот метод к исходной строке для последовательного выделения всех подстрок, соответствующих данному образцу. Например, следующий сценарий var re = /\d+/g; var s = "123 abc 456 def 789 xyz"; var result; while (result = re.exec(s)) document.write(result[0] + " "); выведет на экран обозревателя строку 123 456 789. Примечание. Помните, что в подобных циклах нельзя выполнять операции с регулярными выражениями, поскольку они изменяют статические свойства объекта RegExp. Метод testСинтаксис: регвыр.test(строка) Аргументы: строка любое строковое выражение Результат: логическое значение Метод test выполняет сопоставление строки с образцом, заданным регвыр и возвращает true, нсли сопоставление с образцом прошло успешно, и false в противном случае. Этот метод эквивалентен выражению регвыр.exec(строка) != null. Пример: if (!/(\d+)\.(\d+)\.(\d+)/.test(str)) document.write("Неверное значение строки!"); Метод toStringСинтаксис: регвыр.toString() Результат: строковое значение Метод toString преобразует регвыр в строковое значение. Например, сценарий var x = new RegExp("a+b+c", "g"); document.write(x.toString()); выведет на экран обозревателя строку /a+b+c/g. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||