программирование

Недокументированные возможности

Если не всем, то многим, известно, что в практически в любом устройстве есть ,так называемые, «недокументированные возможности». Первое мое знакомство с ними состоялось еще на примере команд Ассемблера к компьютеру ZX-Spectrum. Владение командами типа LD IYh,10 приятно грело душу. Позже, я еще неоднократно сталкивался с такого рода возможностями в Intel Assembler (LOADALL, SETALC), MS-DOS (системные структуры, 2F и т. п.), Windows (некоторые функции API), телевизорах (встроенные меню) и т. д. Теперь пришлось столкнуться и в Вебе. Точнее в браузере. А еще точнее в Netscape Navigator.

Время от времени я просматриваю exe-файлы браузеров и их dll-ки, в надежде узнать что-то новое. Иногда мои усилия вознаграждаются, чаще — нет. Интересно, кто, кроме разработчиков, знает о существовании тегов NSCP_OPEN, CHARLES, JEAN, SUBDOC, CELL? О типе JOT тега INPUT? Единственный тег, в тайну которого я смог проникнуть самостоятельно — это INLINEINPUT. Как я понял, единственное его назначение заключается в подчеркивании текста прерывистой линией. Конечно, те же телевизионные сервисные меню не стоит делать достоянием общественности, но вот дополнительные теги браузера можно и открыть — ничего страшного не произойдет (раз уж все равно сделали, теперь выбрасывать что ли?). Зато это добавит в скудную палитру «украшательств» верстальщика под Netscape пару новых возможностей.

Простой опыт показывает, что информацию о них в сети найти можно, если очень постараться. После 2-х часового анализа результатов работы 5-ти поисковых машин вот, что я выяснил:

  • SUBDOC — «определяет субдокумент с собственным окружением. Может быть вложен.» Что бы это значило? Эксперименты ни к чему не привели.
  • HYPE — Судя по косвенным ссылкам раньше воспроизводил какой-то звук. Оставлен как заглушка.
  • MQUOTE — Средство для цитирования почтовых сообщений.
  • COLORMAP — упоминается как параметр (PRIVATE|DITHERED|YES|NO) тега EMBED. Похоже используется в каком-то плагине.

На большее моего терпения не хватило. Так вопрос о том, что такое CELL, CHARLES, JEAN, NSCP_CLOSE, NSCP_OPEN, NSCP_REBLOCK, UNKNOWN и т. д. остается открытым.

Оставить комментарий

Плохая дока или ее отсутствие?..

Какими иногда путями узнаешь о некоторых особенностях языка программирования, операционной системы или СУБД… Ну нет у меня времени и желания внимательно читать всю доку по PHP, например.

Поясню: как много людей, программирующих на PHP, знают о существовании в нем конструкции <?=$variable?>? Я о ее существовании узнал вчера. Из чужого листинга. Для хохмы попытался найти ее через «Table of Contents» родной доки. Не удалось. Пришлось набирать в командной строке магическое grep '[%\?] *= *\$' * чтобы узнать, что эта, довольно полезная фича, упоминается в доке аж два раза, но эпизодически, и в разделе «Escaping from HTML». Кто бы мог подумать? Там, кстати, говорится, что это shortcut к echo. Тогда такой вопрос: почему бы этот самый shortcut не поместить рядом с echo (раздел « String function») или хотя бы дать ссылку на него в «see also…»?

Еще хуже дело обстоит с PostgreSQL. Для интереса зайдите в Postgres monitor (psql) и наберите: \dd regexeqjoinsel. — «O!», — думаете вы — «новая функция!». Не спешите искать информацию по ней в официальной доке. Там эта функция даже не упоминается. Кстати, это далеко не единственный пример. По-моему, дока для Постгреса — худшая в мире.

Это что касается софта под Unix. Документация для платформы Windows обычно составлена лучше. По крайней мере та ее часть, что от Microsoft. Конечно, мало кто знает, что такое HTA или WScript, но информации по ним вполне достаточно, просто эти вещи мало кому нужны.

У Microsoft другая крайность — описывать все тщательно, но с опозданием. Меня вот интересует вполне конкретный вопрос: в чем с точки зрения разработчика разница между Jet4.00SP5 и Jet 3.00? Боюсь, придется подождать пару месяцев, до выхода 5-й версии, прежде чем я смогу получить на него ответ.

Кстати, с начинающим наступать Миллениумом вас!

Оставить комментарий

99 бутылок: PostgreSQL, MySQL, xSSI, CMD, PHP, JUnix Shell

Есть такой прелюбопытный сайт «99 Bottles of Beer on The Wall». Это сборник листингов программ, написанных на разных языках, но выводящих один и тот же текст — «песню про пиво». Как ни странно, но я обнаружил, что могу пополнить список из 227 языков, представленных на сайте, еще своими 6 экземплярами. Что я без промедления и сделал. Но, так как владелец сайта занят переездом на новый адрес и ему пока не до меня, я решил выложить эти образцы здесь, чтобы широкая общественность могла полюбоваться делом рук моих.

1. PostgreSQL (СУБД) https://www.postgresql.org/

YourTable — это ваша таблица с числом строк более 100.

-- Written by Evgeny.Stepanischev at ksu.ru
-- 
CREATE SEQUENCE temp_beer_seq INCREMENT -1 MINVALUE 0 MAXVALUE 99 START 99;
CREATE FUNCTION temp_b() RETURNS text
AS 'SELECT \' bottle\'||CASE WHEN last_value=1 THEN
\'\'::text ELSE \'s\'::text END||\' of beer\' FROM temp_beer_seq'
LANGUAGE 'sql';
        
CREATE FUNCTION temp_b_out() RETURNS text
AS 'SELECT s.last_value||temp_b()||\' on the wall, \'||
s.last_value||temp_b()||\'.\\n Take one and pass it around,\\n \'||
CASE WHEN NEXTVAL(\'temp_beer_seq\')=0 THEN \'No\'
 ELSE text(s.last_value-0) END||
temp_b()||\' on the wall.\\n\'
FROM temp_beer_seq s'
LANGUAGE 'sql';

SELECT CASE WHEN temp_beer_seq.last_value=0
THEN 'No more bottles of beer...\n Go to the store and buy some more...\n
 99 bottles of beer.' ELSE temp_b_out() END
FROM YourTable LIMIT 100,1;
                    -- 

DROP SEQUENCE temp_beer_seq;
DROP FUNCTION temp_b();
DROP FUNCTION temp_b_out();
-- END

2. MySQL (СУБД) https://www.mysql.com/
YourTable — это ваша таблица с числом строк более 100.

/* Program by Evgeny.Stepanischev at ksu.ru*/
SET @beer:=100;
SET @w:=' on the wall';
SELECT IF(@beer<2,'\nNo more bottles of beer...\n\
Go to the store and buy some more...\n99 bottles of \
beer.',CONCAT(CONCAT('\n',@str:=CONCAT(@beer:=@beer-1,\
@bot:=CONCAT(' bottle',IF (@beer>1,'s',''),' of beer')),\
@w,', ',@str,'.\nTake one and pass it around,\n'), IF \
(@beer-1=0,'No more ',@beer-1),@bot,@w,'.')) as beer
FROM YourTable LIMIT 100;


3. xSSI для Apache https://httpd.apache.org/
Знаком «█» обозначено место, где перевод строки не нужен,
просто строчки такие длинные, что пришлось их разбить.

<!-- Written by Evgeny.Stepanischev at ksu.ru -->
<!--#if expr="$D=A || $D=B" -->
        <!--#if expr="$K=/${D}8/" -->
        <!--#set var="D" value="8" -->
        <!--#set var="M" value="7" -->
        <!--#elif expr="$K=/${D}7/" -->
        <!--#set var="D" value="7" -->
        <!--#set var="M" value="6" -->
        <!--#elif expr="$K=/${D}6/" -->
        <!--#set var="D" value="6" -->
        <!--#set var="M" value="5" -->
        <!--#elif expr="$K=/${D}5/" -->
        <!--#set var="D" value="5" -->
        <!--#set var="M" value="4" -->
        <!--#elif expr="$K=/${D}4/" -->
        <!--#set var="D" value="4" -->
        <!--#set var="M" value="3" -->
        <!--#elif expr="$K=/${D}3/" -->
        <!--#set var="D" value="3" -->
        <!--#set var="M" value="2" -->
        <!--#elif expr="$K=/${D}2/" -->
        <!--#set var="D" value="2" -->
        <!--#set var="M" value="1" -->
        <!--#elif expr="$K=/${D}1/" -->
        <!--#set var="D" value="1" -->
        <!--#set var="M" value="0" -->
        <!--#elif expr="$K=/${D}0/" -->
        <!--#set var="D" value="0" -->
        <!--#else -->
        <!--#set var="D" value="9" -->
        <!--#set var="M" value="8" -->
        <!--#endif -->

<!--#else -->

        <!--#set var="D" value="A" -->
        <!--#set var="K" value="$QUERY_STRING" -->
        <!--#include virtual="$DOCUMENT_NAME" -->
        <!--#set var="A" value="$D" -->
        <!--#set var="Am" value="$M" -->

        <!--#set var="D" value="B" -->
        <!--#include virtual="$DOCUMENT_NAME" -->
        <!--#set var="B" value="$D" -->
        <!--#set var="Bm" value="$M" -->

        <!--#if expr="$A=0 && $B=0" -->
                <BODY BGCOLOR="BLACK" TEXT="WHITE"><B>
                No more bottles of beer...<br>
                Go to the store and buy some more...<br>
                99 bottles of beer.
                </BODY>
        <!--#else -->

                <HEAD>
                <!--#if expr="$B=0" -->
                        <!--#set var="A1" value="$Am" -->
                        <!--#set var="B1" value="9" -->
                <!--#else -->
                        <!--#set var="A1" value="$A" -->
                        <!--#set var="B1" value="$Bm" -->
                <!--#endif -->
                <META HTTP-EQUIV="Refresh" Content="1;█
URL=http://<!--#echo var="HTTP_HOST" --><!--#echo var="DOCUMENT_URI" -->?A█
<!--#echo var="A1" -->B<!--#echo var="B1" -->">
                </HEAD>

                <BODY BGCOLOR=BLACK TEXT=WHITE><B>
                <!--#if expr="$A>0" --><!--#echo var="A" --><!--#endif -->█
<!--#echo var="B" -->
                bottle<!--#if expr="$A$B>1" -->s<!--#endif -->
                of beer on the wall, <!--#if expr="$A>0" -->█
<!--#echo var="A" --><!--#endif --><!--#echo var="B" -->
                bottle<!--#if expr="$A$B>01" -->s<!--#endif --> of beer.<br>
                Take one and pass it around,<br>

                <!--#if expr="$A1$B1>00" -->
                        <!--#if expr="$A1>0" --><!--#echo var="A1" -->█
<!--#endif --><!--#echo var="B1" -->
                        bottle<!--#if expr="$A1$B1>01" -->s█
<!--#endif --> of beer on the wall.
                <!--#else -->
                        No more bottles of beer on the wall.
                <!--#endif -->
                <!--#set var="C" value="" -->
                <BR>
                </B></BODY>
        <!--#endif -->
<!--#endif -->


4. Win2000 batch file (CMD)

@ECHO OFF
REM Evgeny.Stepanischev at ksu.ru

FOR /L %%B IN (99,-1,1) DO CALL :PROG %%B
ECHO No more bottles of beer...
ECHO Go to the store and buy some more...
ECHO 99 bottles of beer. 
GOTO :EOF

:PROG
ECHO %1 bottle(s) of beer on the wall, %1 bottle(s) of beer.
ECHO Take one and pass it around,
SET /A S=%1-1
IF %S% EQU 0 SET S=No
ECHO %S% bottle(s) of beer on the wall.
ECHO.


5. PHP https://www.php.net/

<?
for ($s='s' and $beer=99;$beer;)
{
    echo "$beer bottle$s of beer on the wall, $beer bottle$s of beer.<br>",
    "\nTake one and pass it around,<br>";
    $beer--;
    $s = $beer==1?'':'s';
    if ($beer) echo "$beer bottle$s of beer on the wall.<br><br>";
};
?>
No more bottles of beer on the wall.<br><br>
No more bottles of beer...<br>Go to the story and buy some more...<br>
99 bottles of beer.


6. JUnix SHell junix.kzn.ru https://github.com/bolknote/junix
Предупреждаю: JUSH работает настолько медленно, что вы вряд ли дождетесь результата работы. Для испытания лучше уменьшить константу «beer» до 4-х.

set beer=99
set s=s
while ($beer gt 0)
echo $beer bottle$s of beer on the wall, $beer bottle$s of beer.
echo Take one and pass it around,
set beer--
if ($beer==1) set s=
if ($beer) echo $beer bottle$s of beer on the wall.\n
end
cat <<T
No more bottles of beer on the wall.

No more bottles of beer...
Go to the store and buy some more...
99 bottles of beer.
T


Оставить комментарий

Блоки try… catch… finally… в JScript 5

Заметка была впервые опубликована на сайте «Цитфорум» в 1999-м году, дата публикации примерно восстановлена из «Веб-архива»

Пояснение для людей не знакомых с данной конструкцией:

  • Конструкция try — catch — finally предназначена для перехвата ошибок (исключений). Если в блоке try каком-то операторе возникает ошибка, JScript игнорирует остальные операторы и переходит в блок catch, где находится блок обработки исключений. Последним выполняется блок finally, в котором обычно выполняют некие заключительные действия. Допускается использование неполной конструкции — без catch или finally.

Скажу сразу, что бы не было никаких недоразумений: JScript — это JavaScript в интерпретации Microsoft, а 5-я версия предполагает наличие Internet Explorer 5.0 (в 4-м IE всего лишь 3-я версия JScript).

Не знаю как вы, а я, сколько программирую на J[ava]Script мечтал, что бы в этом языке появился наконец эта конструкция из двух слов, но шли годы, а заветные слова так и оставались зарезервированными и я уж было потерял всякую надежду, как вышел пятый IE…

И вот, однажды вечером, внося очередные изменения в свой JS Unix и роясь одновременно во внутренностях 5-го «зонда» взгляд мой зацепил знакомые try, catch и незнакомое Error. Смутная надежда маленьким мерцающим огоньком загорелась в моей душе. Осторожно, не давая ей погаснуть я протянул руки к клавиатуре, набрал try… catch… и в место досадного «зарезервированные слова», получил радостное «предполагается наличие }». Надо было видеть меня в тот момент (или слышать), каюсь: я кричал, что Гейтс молодчина. Каюсь, потому что Гейтс — плохой дядя, сделал в пятой версии то, что надо было сделать еще в первой. Ну да ладно, это все замечательно, но надо было сделать так, что бы кроме пятого эксплорера, остальные браузеры не замечали этот блок. Хорошо, что в JScript есть такая замечательная вещь, как условная компиляция. Воспользовавшись ею можно скрыть все что угодно от посторонних глаз Netscape Navigator и Internet Explorer 4.01 и ниже. Таким образом, вся конструкция выглядит так (после точки с запятой — мои комментарии):

/*@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. При перехвате ошибки конструкцией try-catch созданный объект будет передан блоку catch. Примеры:

var err=new Error(-10,"Неверное число");
throw(err);

throw(new Error(-4,"Ошибка"));

Таким образом JScript пополнился еще одной полезной конструкцией, существенно упрощающей жизнь программиста.

Web-программист казанского центра Интернет Степанищев Е.В.

Оставить комментарий

Что нового в JavaScript версии 1.3 от Netscape

Заметка была впервые опубликована на сайте «Цитфорум» в 1999-м году, дата публикации примерно восстановлена из «Веб-архива»

Язык 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 (Not-a-Number) было определено только для объекта Number, в версии 1.3 это значение также определено, и для объекта global. NaN никогда не равно ни одному другому числу, включая NaN. Функции, работающие с числами (например Number.constructor, parseFloat и parseInt) возвращает 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) теперь задается беззнаковым 32-битным целым. Значение свойства length может лежать в пределах от 0 до 232-1.

Конструктор

В JavaScript 1.3 при использовании конструктора с единичным параметром (new Array(len)) конструктор проверяет тип параметра. Если это число конструктор конвертирует его в 32-битное беззнаковое целое и создает массив со свойством length(размер массива), установленное в integer. Начальные значения элементов массива — undefined.

Метод 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-программист казанского центра интернет Степанищев Евгений

Оставить комментарий

← 1 62 63 64 65 66 67 →