citforum
Блоки try… catch… finally… в JScript 5
Заметка была впервые опубликована на сайте «Цитфорум»
Пояснение для людей не знакомых с данной конструкцией:
- Конструкция try — catch — finally предназначена для перехвата ошибок (исключений). Если в блоке try
каком-то операторе возникает ошибка, JScript игнорирует остальные операторы и переходит в блок catch, где находится блок обработки исключений. Последним выполняется блок finally, в котором обычно выполняют некие заключительные действия. Допускается использование неполной конструкции — без catch или finally.
Скажу сразу, что бы не было никаких недоразумений: JScript — это JavaScript в интерпретации Microsoft,
Не знаю как вы, а я, сколько программирую на J[ava]Script мечтал, что бы в этом языке появился наконец эта конструкция из двух слов, но шли годы, а заветные слова так и оставались зарезервированными и я уж было потерял всякую надежду, как вышел пятый IE…
И вот, однажды вечером, внося очередные изменения в свой JS Unix и роясь одновременно во внутренностях
/*@cc_on @*/ ; Включаем условную компиляцию
/*@if (@_jscript_version>4) ; Проверяем версию JScript
try ; Сам блок try
{@end @*/
Result=eval(expression); ; Делаем что-то полезное
/*@if (@_jscript_version>4)
} catch (err) ; «Ловим» ошибку
{
alert(err.description); ; Сообщение об ошибке
Result='';
} finally
{
alert(Result); ; Завершающие действия
};
@end @*/
/*@cc_off @*/ ; Выключаем условную компиляциюГде еrr — имя объекта Error, который будет создан при возникновении ошибки, в него будут помещены параметры ошибки. Объект Error имеет три конструктора и два свойства:
err=new Error();
err=new Error(number);
err=new Error(number, description);Свойство (и параметр конструктора) number — числовое значение (номер ошибки), свойство description (так же параметр конструктора) — строка, описание ошибки. Некоторые числовые значения и соответствующие им описания ошибок приведены в таблице ниже:
| Номер ошибки | Описание ошибки |
| -2146823279 | Определение отсутствует |
| -2146827282 | Предполагается наличие ‘)’ |
| -2146827273 | Незавершенная строковая константа |
| -2146827286 | Ошибка синтаксиса |
| -2146827280 | Предполагается наличие { |
| -2146827850 | Объект не поддерживает это свойство или метод |
| -2146827843 | Команда не поддерживается объектом |
| -2146827859 | Невозможно создание объекта сервером программирования объектов |
| -2146828235 | Файл не найден |
Существует способ программно возбудить исключение (создать ошибку) — достаточно вызвать оператор throw с созданным ранее объектом Error. При перехвате ошибки конструкцией
var err=new Error(-10,"Неверное число");
throw(err);
throw(new Error(-4,"Ошибка"));Таким образом JScript пополнился еще одной полезной конструкцией, существенно упрощающей жизнь программиста.
Web-программист казанского центра Интернет Степанищев Е.В.
Найди картинку. Неизведанные возможности Web-дизайна
Заметка была впервые опубликована на сайте «Цитфорум»
Использование встроенных в NC картинок.
Однажды вечером, из любопытства просматривая файл NETSCAPE.EXE, я наткнулся на странный текст:
<IMG SRC=internal-attachment-icon BORDER=0>Словечко internal наталкивало на определенные мысли и я решил их проверить. Набрав эту строку в виндовом блокноте я посмотрел на результат в NC. И вот что я увидел:
Wow! Я решил отыскать другие встроенные картинки, получился довольно приличный список, но уникальных оказалось не очень много, всего 22 штуки. Не ручаюсь, что я нашел все:
А вот список имен:
<IMG SRC=internal-attachment-icon>
<IMG SRC=internal-icon-insecure>
<IMG SRC=internal-icon-show-all-mail-recipients>
<IMG SRC=internal-gopher-binary>
<IMG SRC=internal-gopher-unknown>
<IMG SRC=internal-gopher-movie>
<IMG SRC=internal-gopher-sound>
<IMG SRC=internal-gopher-image>
<IMG SRC=internal-gopher-text>
<IMG SRC=internal-gopher-menu>
<IMG SRC=internal-gopher-index>
<IMG SRC=internal-gopher-telnet>
<IMG SRC=internal-smime-encrypted-bad>
<IMG SRC=internal-smime-signed-bad>
<IMG SRC=internal-smime-encrypted-signed-bad>
<IMG SRC=internal-edit-unsupported-end-tag>
<IMG SRC=internal-edit-unsupported-tag>
<IMG SRC=internal-edit-form-element>
<IMG SRC=internal-edit-named-anchor>
<IMG SRC=about:security?banner-secure>
<IMG SRC=internal-attachment-dl-all-icon>
<IMG SRC=internal-sa-encrypted-bad>
<IMG SRC=internal-sa-signed-bad>
<IMG SRC=internal-news-followup-and-reply>
<IMG SRC=internal-icon-delayed>Использование встроенных рисунков позволяет ненамного, но все же уменьшить размер страницы. Жаль только, что способ непригоден для Internet Explorer’a. В идеале хорошо бы при просмотре страницы Netscape’ом загружался встроенный рисунок, а при использовании IE, нууу… хотя бы картинка из внешнего файла.
И тут я вспомнил о введенном еще в IE 2.0 атрибуте DYNSRC тега IMG.
Этот атрибут предназначен для вывода видеороликов, причем он имеет больший приоритет по сравнению с SRC. Идея оказалась удачной.
С помощью пресловутой кнопки PrintScreen и Adobe Photoshop я изготовил GIF-файл, содержащий первый в моём списке рисунок: internal-attached-icon, потом при помощи досовской утилиты VFD я сконвертировал его в AVI-файл, содержащий
<BODY BGCOLOR=WhiTE>
<IMG SRC=internal-attachment-icon DYNSRC=1.avi WIDTH=27 HEIGHT=27>
</BODY>я посмотрел результат попеременно в NC и IE. Как и следовало ожидать в обоих браузерах я увидел одинаковую картинку:
Как любил говаривать герой игрушки Duke Nukem 3D «piece of cake!». Напоследок я решил просмотреть страничку в браузере Opera 3.51 и тут меня постигло жестокое разочарование: картинка появилась… и иcчезла, я смотрел на абсолютно белую страничку. Проблема решилась добавлением параметра LOOP=-1 в тег IMG. Если вы не рассчитываете, что вашу страницу будут смотреть пользователи браузера Opera, этот параметр лучше убрать, иначе при наведении курсора на картинку он будет мерцать.
Web-программист казанского центра Интернет Степанищев Евгений.
Что нового в JavaScript версии 1.3 от Netscape
Заметка была впервые опубликована на сайте «Цитфорум»
Язык JavaScript 1.3 поддерживается Navigator’ом версий 4.06 и 4.5.
Поддержка Unicode
В строках теперь стало возможным использование любых символов из таблицы Unicode, которые кодируются как шесть ASCII-символов: \u и 4 цифры в шестнадцатеричной кодировке, например, \u0041 — латинская буква «A» из таблицы Unicode. Каждая такая последовательность добавляет только один символ к строке. Функции escape и unescape не подвергались изменениям и не используют Unicode-последовательности.
Следующий пример выведет на экран символ «копирайт» и строку «Netscape Communicator»:
alert("\u00A9 Netscape Communicator");Следующая таблица содержит список наиболее часто используемых специальных символов и их коды в Unicode:
| Unicode | Наименование | |
| \u0009 | Tab | |
| \u000B | Vertical Tab | <VT> |
| \u000C | Form Feed | <FF> |
| \u0020 | Space | <SP> |
| \u000A | Line Feed | <LF> |
| \u000D | Carriage Return | <CR> |
| \u000b | Back Space | <BS> |
| \u0009 | Horizontal Tab | <HT> |
| \u0022 | Double Quote | " |
| \u0027 | Single Quote | ` |
| \u005C | Backslash | \ |
Вы можете использовать Unicode для отображения символов в различных языках или технических символов. Для отображения символов Unicode у клиента должны быть установлены шрифты Unicode. Некоторые ОС, например Windows 95, поддерживают Unicode лишь частично.
Новые свойства объекта Global
NaN
Синтаксис
NaN
В JavaScript 1.2 значение NaN (
Infinity
Синтаксис
Infinity
Числовое значение величины Infinity — бесконечность. В JavaScript 1.2 Infinity было определено как свойство объекта Number. У объекта Number есть два свойства POSITIVE_INFINITY и NEGATIVE_INFINITY (для примера, Number.POSITIVE_INFINITY). В JavaScript 1.3 Infinity определено и для объекта Global. Значение Infinity (положительная бесконечность) всегда больше, чем любое другое число, включая себя. Infinity полностью соответствует математической бесконечности. Например любое число, умноженное на Infinity, есть Infinity, любое число, деленное на Infinity, есть 0.
undifined
Синтаксис
undefined
Переменные, которым не было присвоено значение, имеют значение undefined. Теперь вы можете использовать undefined для проверки того, было ли присвоено переменной значение. Методы и выражения JavaScript также возвращают значение undefined, если используемые переменные не имеют своего значения. undefined — это свойство объекта Global, которое имеет значение undefined.
Пример:
var input;
if(input == undefined){
document.write("переменной input значение не присвоено");
}Новые функции объекта Global (IsFinite)
IsFinite
Синтаксис
IsFinite(число)
Вы можете использовать эту функцию, для определения конечности числа. Если аргумент функции NaN положительная или отрицательная бесконечность, функция возвращает false, иначе она возвращает true.
Пример:
Проверка числа на конечность
if(isFinite(Input) == true)
{
// Ваш код
}Метод toSource
Синтаксис
toSource()
Это новый метод, определенный для всех встроенных объектов. Большинство объектов наследуют этот метод от Object. Метод toSource базируется на методе toString объектов Object и Array.
toSource возвращает строку, которой вы создавали объект. Вы можете подставлять это значение в функцию eval, сохранять его и др. Для объекта tools метод eval(tools.toSource()) вернет копию объекта tools. Если tools содержит рекурсивные свойства, то строка, которую вернет функция toSource() может выглядеть странно.
Пример:
product = {type: "electronic", value: 500};
myList = ["school", 4, "home", 10];
myBool = new Boolean;
myString = new String("my line");
myDate = new Date();
document.write(product.toSource());
document.write(myList.toSource());
document.write(myBool.toSource());
document.write(myString.toSource());
document.write(myDate.toSource());Расширение объекта Date
В предыдущих версиях JavaScript формат даты был зависим от платформы и различных установок. В новой реализации объект Date полностью платформонезависим. Объект Date теперь поддерживает дату и время в формате UTC (Universal Coordinated Time). Дата задается как количество миллисекунд, прошедших с 1 января 1970 года. День содержит 86400000 миллисекунд.
Следующий пример возвращает разницу между timeA и timeB в миллисекундах:
timeA = new Date();
alert("подождем какое-то время");
timeB = new Date();
timeDifference = timeB - timeA;Для работы с миллисекундами были добавлены методы getMilliseconds() и setMilliseconds(num_ms), getUTCMilliseconds() и setUTCMilliseconds(num_ms). Для устранения проблеммы 2000 года добавлены функции setFullYear, getFullYear, setUTCFullYear и getUTCFullYear. getFullYear возвращает полный год, например 1998, а setFullYear — устанавливает. Методы setYear и getYear оставлены для обратной совместимости.
Новый конструктор объекта Date
Конструктор объекта Date был расширен для поддержки миллисекунд, его полный формат:
Date (yr_num, mo_num, day_num, [, hr_num[, min_ num[, sec_num[, ms_num]]]])
UTC
UTC — метод объекта Date, теперь также поддерживает миллисекунды.
Date.UTC(year, month, date, [, hours[, min[, sec[, ms]]]])
Для поддержки UTC были введены getUTCFullYear(), getUTCMonth(), getUTCDate(), getUTCDay(), getUTCHour(), getUTCMinutes(), getUTCSeconds(), getUTCMilliseconds(), setUTCFullYear(year [, month[, date]]), setUTCMonth(month[, date]), setUTCDate(date), setUTCHour(hours[, min[, sec[,ms]]]), setUTCMinutes(min[, sec[, ms]]), setUTCSeconds(sec [, ms]), setUTCMilliseconds(ms) и toUTCString() ( превращает дату в строку, используя соглашение Universal Coordinates Time). Рассматривать эти методы более подробно не имеет смысла, их предназначение вполне понятно из названия.
Изменения в методах объекта Date
Методы объекта Date в версии 1.3 получили дополнительные параметры:
setMonth(month[, date])
setHours(hours[, min[, sec[, ms]]])
setMinutes(min[, sec[, ms]])
setSeconds(sec[, ms])
Теперь эти методы по своей форме полностью эквивалентны методам setUTC-.
Новые методы объекта Function
call
Синтаксис
call(thisArg, arg1, arg2, ...)
Параметры
thisArg —вызываемый объект
arg1, arg2,… — параметры вызываемого объекта
call позволяет вызывать методы одних объектов в контексте других (вызвавших) объектов. Это дает возможность задать свое значение объекту this, при вызове функции и, что самое главное, метод call позволяет написать метод один раз и наследовать его для других объектов не переписывая их! (См. также apply).
Пример:
function product(name, value)
{
this.name = name;
if(value > 1000) this.value = 999; else this.value = value;
}
function prod_dept(name, value, dept)
{
this.dept = dept;
product.call(this, name, value);
}
prod_dept.prototype = new product();
cheese = new prod_dept(feta, 5, food);
car = new prod_dept(honda, 5000, auto);apply
Синтаксис
apply(thisArg, argArray)
Параметры
thisArg — вызываемый объект
arg1, arg2,… — параметры вызываемого объекта
apply позволяет применять методы одних объектов в контексте других (вызывающих). Так же как и в call объект this может принимать заданное значение (this будет указывать на текущий, вызвавший объект). apply очень напоминает call, отличие лишь в типах параметров (аргументов) вызываемого объекта. В методе apply возможно использование любых типов массивов. Например: apply(this, new Array(name, value)). Разрешается так же использовать свойства вызываемого объекта. Можно использовать arguments для передачи всех параметров вызываемому объекту.
Пример:
function product(name, value)
{
this.name = name;
if(value > 1000) this.value = 999; else
this.value = value;
}
function prod_dept(name, value, dept)
{
this.dept = dept;
product.apply(product, arguments);
}
prod_dept.prototype = new product();
cheese = new prod_dept(feta, 5, food);
car = new prod_dept(honda, 5000, auto);Операторы === и !==
Операторы === и !== проверяют на соответствие (и не соответствие) операнды одинаковых типов (т. е. например оба операнда должны быть типа String). При сравнении с помощью этих операторов не происходит преобразования типов. Их использование необходимо, когда нужно убедиться, что оба операнда имеют одинаковый тип и одинаковые (или разные) значения.
Пример:
10 === '10'вернет false, тогда как
10 == '10'вернет true.
Изменения в операторах == и !=
Если операнды разного типа, происходит преобразование. Как результат возвращается значение типа Boolean. Если типы операндов одинаковы, то операторы == и != эквивалентны === и !==. Значения null и undefined считаются одинаковыми, NaN считается не равным ни одному значению, включая NaN.
Пример:
10=='10'возвращает true.
Изменения в объекте Array
Свойство length
Длина массива (свойство length) теперь задается беззнаковым
Конструктор
В JavaScript 1.3 при использовании конструктора с единичным параметром (new Array(len)) конструктор проверяет тип параметра. Если это число конструктор конвертирует его
Метод push
В JavaScript 1.2 метод push возвращал последний элемент, добавленный к массиву. В версии 1.3 метод возвращает новую длину массива.
Метод splice
В JavaScript 1.2 метод splice возвращал удаленный элемент, если удалялся только один элемент (параметр howMany равен 1). В JavaScript 1.3 splice всегда возвращает массив, содержащий удаленные элементы. Если удаляется только один элемент, то splice вернет массив, содержащий один единственный элемент.
Метод replace объекта String
Синтаксис
replace(regexp, newSubStr)
replace(regexp, function)
В JavaScript 1.3 в качестве второго параметра можно использовать функцию. В этом случае заданная функция будет вызвана после метода match и ее результат (строка) заменит найденную подстроку. Есть возможность передать найденную подстроку функции. Первый параметр функции содержит найденную подстроку, остальные — подсовпадения в найденной строке. Надеюсь следующий пример разъяснит смысл вышесказанного:
"XXzzzz".replace(/(X*)(z*)/, function (str, p1, p2) {return str +" - " + p1 +" , " + p2;} )вернет XX.zzzz — XX , zzzz
Объект Boolean
В JavaScript 1.2 значение false объекта Boolean трактовалось как ложь в логических выражениях. Если Boolean использовался в операторе if (if (выражение)), JavaScript 1.2 использовал значение объекта Boolean. В JavaScript 1.3 все объекты в логических выражениях трактуются, как истина, включая объект Boolean, даже если он имеет значение false.
Пример:
x = new Boolean(false);
if(x) // значение этого выражения - истина
{
// Выполнение кода
}toString
В JavaScript 1.3 метод toString объекта Object возвращает [object type], где type — имя объекта или имя конструктора объекта. Метод toString объекта Array вернет строку, содержащую значения всех элементов, разделенных запятыми.
Пример:
var SeaLion=new Image();
alert(SeaLion.toString()); // выдаст [object Image]eval
Функцию eval можно вызывать не напрямую. Для примера можно использовать следующий код:
var x = 2;var y = 4;
var myEval = eval;
myEval(x + y);
eval(x + y);Использование операции присваивания в логических выражениях
Ранние версии JavaScript конвертировали операции присваивания в логических выражениях в операции сравнения, другими словами if (x=y) превращалось в if (x==y). В Navigator 4.06 и выше возможно использование присваивания, если воспользоваться следующей конструкцией: if ( (x=y) ).
Web-программист казанского центра интернет Степанищев Евгений