10 заметок с тегом

netscape

«Chomp!»

Игрушка «Chomp!», входящая в состав плеера Cosmo VRML Player — вы играете за акулу, поедающую разное

Где-то в конце девяностых, копаясь в папках популярного тогда браузера компании «Нетскейп», я натолкнулся на игрушку, написанную с использованием VRML — языка для демонстрации трёхмерной интерактивной графики. Сейчас он практически забыт, а в те годы активно пытался завоевать популярность.

С тех пор, в те редкие моменты, когда кто-то из собеседников вспоминал VRML, я рассказывал про ту игру. Всё, что я о ней помнил — играть надо за акулу, которая плавает и что-то там поедает. За все эти годы мне не встретился ни один человек, который бы понимал о чём я говорю.

Иногда я её пытался нагуглить, но без результата, и уже начал думать, что это какое-то ложное воспоминание.

Вчера решил предпринял очередную попытку, гуглил до изнеможения, пока не нашёл где-то упоминание, что компания «Нетскейп» когда-то распространяла свой браузер с вместе с «Cosmo VRML Player».

Подумал — не могла ли та игрушка быть частью этого плеера? Скачал его инсталлятор примерно тех времён, распаковал и вздохнул с облегчением — внутри нашлись файлы чего-то, напоминающего искомую игру. Но для чистоты эксперимента решил посмотреть на неё вживую.

У меня на ноутбуке уже есть виртуализация — «Parallels Desktop» какой-то бородатой версии, так что я просто скачал в интернете первую попавшуюся загрузочную дискету ДОС с поддержкой сидирома, образ «Виндоуз 95» и всё установил.

Потом поставил внутрь «Нетскейп Навигатор 4.04», «Космо Плеер 2.1», «DCOM95», «DirectX 8.0a» и универсальный видеодрайвер. Именно с таким набором ПО всё завелось и довольно шустро заработало.

Файлы передавал через образы, монтируя их в виртуальной среде как сидиром. Оказалось «Дисковая утилита» «Мака» умеет такие образы создавать (только надо выбирать гибридный формат без сжатия).

Всё как я помнил — плавает акула, что-то там ест (рыб и уток). Не захватывающе, но вполне играбельно даже по нынешним временам, портировать на смартфон и можно продавать за небольшую цену.

 4 комментария    44   2018   netscape   айрхеология

Тег HYPE (Netscape HYPE tag sound)

Скриншот MacOS 9 с открытым окном браузера

Пятнадцать лет назад, ковыряя исходники браузера «Нетскейп», я наткнулся, в частности, на тег HYPE — в интернете того времени писали, что он воспроизводит какой-то звук, но только в старых версиях браузера и не под «Виндоуз». «Мака» у меня тогда не было, как и доступа к «Линуксу» с графическим интерфейсом, поэтому безуспешно поискав по интернету подробности, я исследование забросил.

Сегодня за завтраком, по другому случаю наткнувшись на свою же статью об этом теге, я подумав, что теперь-то в интернете найдётся всё, попробовал разыскать тот самый звук. По-прежнему безуспешно. Есть только несколько чудом сохранившихся страничек, где этот тег упоминается в контексте перечня «пасхальных яиц» «Нетскейпа» и это всё.

Но времена же изменились! Теперь у нас есть виртуализация, образы виртуальных машин и быстрый интернет! Где-то полчаса ушло на поиск и скачивание второй версии «Нетскейпа», готовой виртуалки с девятой «МакОСью», установку всего найденного, разбирательство как всё запускается. Но при вводе заветного тега меня ждало препятствие, к счастью, устранимое — виртуалка заявила, что у меня нехватает какой-то Sound Machine и, вместо проигрывания звука, предложила скачать звуковой файл.

Файл оказался в формате .snd, который нормально открылся и проигрался уже в современном «Маке». Его содержимое — фраза «What is global hypermedia?» (из документа NCSA Mosaic Demo 1993 года, как объясняется на одной из страниц в интернете). Я сконвертировал его в обычный МП3 и, если ваш браузер достаточно современный, можете послушать как звучит тот самый секретный тег:

Кстати, жаль, что я не догадался проиграть его на оригинальном «Макинтоше» в музее Эпл, в Москве. Если представиться случай, обязательно попробую!

CSS vs. JSSS

Почти никто не помнит, но в прошлом веке, в браузере Netscape Navigator (который позже стал Communicator) был ещё один способ задавать таблицы стилей — JSSS.

Вообще, сейчас принято с теплотой вспоминать поделие Netscape и осуждать Microsoft за самоуправство в стандартах, но тогда время было такое. Кто такие были W3C и кто — Microsoft с Netscape. В Netscape придумывали «стандартов» никак не меньше (а то и больше), чем в Microsoft. И где сейчас LAYER, MULTICOL или тот же JSSS? Впрочем, фирма Netscape в 1996 году отправила JSSS в W3C.

Выглядел JSSS примерно так (даже функции поддерживались!):

<style type="text/javascript">
 tags.p.fontSize = "14pt";
 with(tags.H2)
 {
   color = "red";
   fontSize = "16pt";
   marginTop = "2cm";
 }
contextual(tags.H1, tags.EM, ids.x78, classes.foo.all).color = evaluate_color();
tags.P.firstLine.fontStyle = "small-caps";
tags.IMG.width = .50 * document.width;
if (visual.colorDepth > 2) {
  body.bgColor = "white";
  body.color = "blue";
} else {
  body.bgColor = "black";
  body.color = "white";
}
</style>

И иногда, перебирая в голове ушедшие технологии, я задумываюсь — а не было бы принятие JSSS вместо CSS более удачным шагом? Нужно было бы учить на один язык меньше (JS уже есть в браузере), да и последние тенденции в CSS3 показывают, что он медленно двигается в сторону какой-то странного скриптового языка.

Вот пример:

@media only screen and (max-width: 1024px) {
    div {
        width: -moz-calc(100% - 2 * 3px);
        height: -moz-max(50%, 18px);
    }
}

@-webkit-variables {
   step: -1;
}

ol {
    counter-reset: list -webkit-var(step);  
}
li:before {
    counter-increment: list;
    content: counter(list) ". ";
}

Уже похоже на какой-то язык программирования, не так ли? Переменные, какие-никакие циклы, функции (min, max), условия, арифметические действия.

Так вот, нужно ли это всё было городить? В JavaScript это уже есть. Впрочем, нужны, конечно, ограничения, чтобы JSSS не превратился в труднопроходимую кашу, CSS более лаконичен и строг. Но вопрос в том, удобно ли уже сейчас читать CSS больших проектов? Я пробовал, мой ответ — вряд ли. Это чудовищно сложно.

В общем, мне кажется, что Netscape был в чём-то прав. В этом направлении стоило двигаться.

Конец вечноживого Netscape

Компания AOL наконец-то решила не играть больше в некромантов и «закопать стюардессу» (см. анекдот). Браузер Netscape наконец-то перестанет существовать, патчи, закрывающие возможные дыры будут выходить ещё до 1 февраля 2008-го года, после чего всем пользователям рекомендуется перейти на FireFox, с которым Netscape роднит общее ядро от Mozilla. Ещё одной головной болью у верстальщиков станет меньше.

JavaScript: Недосказанное Нетскейпом

Не оставляя надежду найти аналог CollectGarbage в Netscape, я сегодня расковырял интерпретатор JavaScript’а своего браузера на предмет наличия всего недокументированного. Ковырять вручную было лениво и я сначала написал небольшую программку, вычесывающую все текстовое из файла, на Перле, а потом небольшой скриптик под JUnix, который проверил, что из найденного относится к JavaScript. Ничего похожего на вызов сборщика мусора я так и не нашел, зато нашел кое-что другое. Результатами хочу поделиться.

Script(string) — создает кусок JavaScript-кода, который можно вызвать как обычную функцию. Разница между этим конструктором и Function заключается в том, что из кода, созданного конструктором Script, нельзя получить доступ к arguments и прочим свойствам и методам, специфическим для функций.

Пример использования Script:

AX      = new Script ("alert('TEST')")
AX      ()                      // Нaпечатает "TEST"

Call() — создает пустой объект типа Window. Практической пользы маловато, но, как это можно применить я могу придумать.

Пример того, что можно сделать с Call:

AX      = window
AX.BX   = "TEST"
alert (window.BX)                       // Напечатает "TEST"

window.BX = "TEST1"
AX      = new Call()
AX.BX   = window.BX
window.BX = "TEST2"
alert (AX.BX)                   // Напечатает "TEST2"

AX.open = window.open
AX.open ("about:blank")         // Откроет новое окно

BX      = {}
BX.open = window.open
BX.open ("about:blank")         // Вызовет ошибку

With(object) — достаточно странная функция. Копирует объект на новое место. Конструктор не вызывается, операция сравнения без приведения утверждает, что был создан новый объект, но изменения в одном экземпляре вызывают изменения в другом. Вообще-то, можно ее вызвать, как конструктор без параметров, в этом случае она создаст объект типа Object.

Пример вызова функции With:

function probe ()
{
        alert ('Create.')
        this.let = let
        this.val = val
}

function let (n)
{
        this.val = n
}

AX      = new probe()           // Напечатает "Create"
BX      = AX
alert   (AX===BX)                       // Напечатает "true"

BX      = With (AX)
BX.let  ("TEST")
alert   (AX.val)                        // Напечатает "TEST"
alert   (AX===BX)                       // Напечатает "false"

Closure(function_object) — очень похожа на With, но с парой отличий. Во-первых, Closure работает только с объектами Function, а во-вторых, ее можно вызвать как конструктор. И вот тут начинается самое странное. Внимание на пример.

Пример вызова функции и конструктора Closure:

function let (n)
{
        this.val = n
}

Function.prototype.let = let
AX      = new Function ("","")

BX      = AX
alert   (AX===BX)                       // "true". Объекты одинаковые.
AX.let  ("TEST1")
alert   (BX.val)                        // "TEST1". И это логично.

BX      = Closure (AX)
alert   (AX===BX)                       // "false". Объекты разные.
AX.let  ("OTHER")
alert   (BX.val)                        // "TEST2". И это тоже логично.

BX      = new Closure (AX)
alert   (AX===BX)                       // "false". Объекты разные.
AX.let  ("TEST2")
alert   (BX.val)                        // "TEST2". И это странно.

Arguments(объект) — в принципе можно применять для дублирования массива аргументов. Если применить как функцию, а не как конструктор, то Netscape может обидится и сказать GPF. А вообще во время экспериментов с этим объектом мой NC 4.7 падал настолько часто, что можно сказать — это его больное место, трогать которое не рекомендуется.

Пример вызова конструктора Arguments:

AX      = new Function ("", "return new Arguments(arguments)")
alert   (AX("TEST1").length)            // "1"
alert   (AX("TEST1","TEST2").length)    // "2"

Желающим испытать свое терпение и способности к обобщению, предлагается выяснить, какие функции несет каждый объект, свойство или метод из списка: __count__, __parent__, __proto__, __name__, __length__, __arity__, __call__, __caller__, __callee__. Кое-что совсем очевидно, но кое с чем придется серьезно помучиться. :))

Мое мнение — все, что я накопал, это усы от внутренней объектной модели браузера. Результат попытки упихать все, что только возможно, в объекты.

P.S. Мучал я Netscape версии 4.7. Как нибудь, надеюсь, руки дойдут до чего-нибудь более современного. Кстати, было бы интересно рассмотреть все эти, вырванные с мясом куски, на предмет дыр в безопасности и crash code.

CollectGarbage. И все-таки она работает!

Сегодня я решился все-таки выяснить, работает ли, найденная мной в MSIE, недокументированная функция CollectGarbage(). Я довольно долго размышлял, как бы мне это сделать, поскольку был уверен в наличии у интерпретаторов JavaScript автоматического сборщика мусора. «Стоит мне удалить объект» — размышлял я — «и сборщик мусора тут же освободит память. Я ничего не смогу проверить».

Монитор. Расход памяти

Но, чтобы с чего-то начать, я решил создать экспериментальный скрипт, дамп которого вы видите ниже, и, понадеявшись на неоперативность автоматического сборщика, попробовать создать объект, потом его удалить и вызвать функцию CollectGarbage.

Скажу сразу — функция работает! Но самое интересное не это. Оказалось, что если в MSIE (ровно, как и в Netscape, позднее я повторил эксперимент и под ним тоже) и есть сборщик мусора, то он очень неторопливый. В одном из экспериментов я прождал около 20 минут, прежде чем мое терпение кончилось!

Более того, если нажать «Create» несколько раз подряд, то память будет выделяться после каждого раза. То есть в программах на JavaScript, постоянно создающих структуры большого объема, вызов этой функции жизненно необходим! Я, например, сегодня же выпущу новую версию JUnix с демоном сборки мусора. К сожалению, как я не старался, мне не удалось найти ничего похожего в версии JavaScript от Netscape. Так что вопрос об высвобождении памяти под этим браузером остается открытым.

Демонстрационный пример:

<SCRIPT>
function Create()
{
        Arr = new Array ()
        for (i = 0; i&lt;100000; i++)
        Arr[i] = '01234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890123456789'
}

function Drop()
{
        delete Arr
}

function Collect()
{
        CollectGarbage()
}
</SCRIPT>
<BODY>
<FORM>
<INPUT TYPE=BUTTON onClick="Create()" VALUE=Create>
<INPUT TYPE=BUTTON onClick="Drop()" VALUE=Drop>
<INPUT TYPE=BUTTON onClick="Collect()" VALUE=Collect>
</FORM>
</BODY>

Недокументированные… Окончание.

Вместо предисловия.

Сегодня Google выдал мне все-таки страницу, URL которой я так жаждал получить. На нем, английским по белому, написано, что теги NSCP_CLOSE, NSCP_OPEN, NSCP_REBLOCK, MQUOTE, CELL, SUBDOC, CERTIFICATE, INLINEINPUTTHICK, INLINEINPUTDOTTED, COLORMAP, HYPE, SPELL и NSDT более не поддерживаются.

Так что в списке подозреваемых на полезную нагрузку остались: CHARLES, JEAN, UNKNOWN и INPUT TYPE=JOT.

Внимательное изучение этой самой страницы увеличило вышеприведенный список еще на два экземпляра: INPUT TYPE=READONLY и INPUT TYPE=OBJECT. Что означает первый, стало понятно после полевого испытания — создается текстовое поле, которое нельзя редактировать. Для чего служит второй, станет понятно ниже. Кроме того, на той же странице я с удивлением узнал, что у тега INPUT есть атрибут HEIGHT.

Все вышеперечисленное вдохнуло в меня новые силы и я, с утроенной энергией, взялся за поисковые машины...

Через пару минут поиска, видимо найдя все-таки с Google общий язык, я нашел остальную интересующую меня информацию, перевод и компиляцию которой я размещаю ниже.

Атрибут JOT предназначен для вывода поля перьевого ввода произвольного размера (атрибут SIZE="xsize,ysize"), размер по умолчанию 200×50, перешел в Netscape, судя по всему, из браузера Mosaic. Используется совместно с атрибутом SRC.

OBJECT создает невизуальный элемент формы для сбора данных от заданного Java-компонента, расположенного на странице. Java-компонент задается при помощи атрибута NAME, который должен быть равен атрибуту ID предыдущего объявления компонента. Его данные попадут на сервер когда пользователь нажмет на кнопку SUBMIT (немного сумбурный перевод, но, думаю, смысл ясен).

Чтение исходников (спасибо AllTheWeb) показало, что тег UNKNOWN — никакой не тег, а абстрактное обозначение любого неизвестного тега, встречающегося в заголовке документа. Сделан этот финт ушами для пропуска контента неизвестных контейнеров. CHARLES и JEAN — это не что иное, как загадочные, но уже не поддерживаемые «теги» INLINEINPUTDOTTED и INLINEINPUTTHICK.

Теги, начинающиеся с букв NSCP были предназначены для внутренних целей браузера, в частности, NSCP_CLOSE закрывал все незакрытые теги, что позволяло «сливать» воедино два незавершенных документа.

Из тех же исходников, кстати, видно, что побочным действием тега HR является закрытие блочного тега P, что действительно имеет место.

Что касается тега COLORMAP, то тут не все так кристально ясно. Это, безусловно, тег, что подтверждает чтение исходников, у него есть атрибут SRC и нет закрывающей пары. Судя по комментариям в коде, этот тег задает карту цвета, которая будет использоваться для всех картинок страницы. Но для чего это нужно, и каков формат этой карты ссылок -— неясно. Кроме того сама, процедура обработки тега стоит под #IFNDEF, так что непонятно, работает он в текущей версии Netscape или отключен.

Тег HYPE был введен «just for fun» и работает (-ал), судя по исходникам, только на Mac и Unix-платформах.

Из других любопытных открытий — существование атрибута SUPPRESS, который заставляет (его значения — TRUE и FALSE) тег LAYER игнорировать свое содержимое до закрывающей пары и того же атрибута у тега A (anchor), только с другим значением — его использование ведет к появлению рамки вокруг ссылки в момент нажатия, как в MSIE. Только непонятно, исходники какой из версий я смотрел — одной из будущих, или какой-то из прошлых, потому что в текущей это не работает.

В общем, я остался доволен сегодняшним результатом поиска. :) И хотя, остались еще кое-какие мелкие вопросы, я уже порядком подустал, так что объявляю свое виртуальное расследование завершенным.

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

Если не всем, то многим, известно, что в практически в любом устройстве есть ,так называемые, «недокументированные возможности». Первое мое знакомство с ними состоялось еще на примере команд Ассемблера к компьютеру 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 и т. д. остается открытым.

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

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

Использование встроенных в 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-файл, содержащий один-единственный кадр и сохранил его под именем 1.avi. Создав следующий HTML-файл:

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

 Нет комментариев    97   1999   citforum   html   netscape

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