{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом javascript",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/javascript\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/javascript\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "136483",
            "url": "https:\/\/bolknote.ru\/all\/javascript-tm\/",
            "title": "JavaScript™",
            "content_html": "<p>Поразительно! Сегодня я узнал, что «<i>JavaScript<\/i>» — <a href=\"https:\/\/tsdr.uspto.gov\/#caseNumber=75026640&caseType=SERIAL_NO&searchType=statusSearch\">зарегистрированная торговая марка<\/a>, принадлежащая компании «Оракл». Она попала к «Ораклу» вместе с другими активами компании «Сан Микросистемс» при её поглощении в 2010-м году.<\/p>\n<p>Большое везение, что «Оракл» до сих пор не попыталась что-нибудь сделать с тем, что их торговую марку используют направо и налево. Попади она к каким-нибудь патентным троллям, мало не показалось бы. К сожалению, не факт, что «Оракл» никогда не перейдёт в их стан.<\/p>\n<p>Автор <i>Node.js<\/i> <a href=\"https:\/\/www.opennet.ru\/opennews\/art.shtml?num=63494\">пытается добиться<\/a> отмены регистрации торговой марки, аргументируя это повсеместным использованием этого названия. Прецеденты есть, насколько я знаю, может и получиться.<\/p>\n<p>Другим выходом из ситуации было бы ещё переименование языка в <i>EMCAScript<\/i> или в <i>LiveScript<\/i> — оба названия <a href=\"https:\/\/bolknote.ru\/all\/language-attribute\/\">имеют<\/a> отношение в ДжаваСкрипту. Но этот путь, как мне представляется, сложнее первого.<\/p>\n",
            "date_published": "2025-06-30T23:48:38+05:00",
            "date_modified": "2025-06-30T23:48:19+05:00",
            "tags": [
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Mon, 30 Jun 2025 23:48:38 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "136483",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "135283",
            "url": "https:\/\/bolknote.ru\/all\/language-attribute\/",
            "title": "Атрибут LANGUAGE",
            "content_html": "<p>Просматривал тут публичные репозитории некого соискателя одной из наших вакансий, обратил внимание, что у него там, помимо всего прочего, лежат решённые задания со «Стэпика». Заглянул из любопытства, никаких особенных выводов не сделал, но удивился, что в тегах одного задания у него <tt>script<\/tt> содержит атрибут <tt>language<\/tt>. Это что же, его до сих пор учат писать?<\/p>\n<p>Мне стало любопытно — он вообще сейчас какое-то значение имеет? Браузеры на него ориентируются? Когда-то он вполне имел смысл — у «Эксплорера», например, там мог стоять <tt>VBScript<\/tt> или, например, <tt>JScript.Encode<\/tt> — зашифрованный текст программы на ДжейСкрипте, это такой диалект ДжаваСкрипта от Микрософта.<\/p>\n<p>Проверил. В документации он считается устаревшим, но если подставить туда неизвестное браузеру значение, скрипт не выполняется. В принципе, это логично. В интернете вполне могут встречаться ещё и древние сайты, использующие другие языки, зачем выполнять то, что браузер выполнить не может?<\/p>\n<p>А что же считается верным значением для ДжаваСкрипта? В угадайку играть не хотелось, скачал исходники «Хромиума», посмотрел что там используется. Как оказалось, подставить можно следующие значения (регистр значения не имеет):<\/p>\n<ul>\n<li><tt>javascript<\/tt> или <tt>x-javascript<\/tt> — это понятно, единственный сюрприз, что можно поставить «экс» перед словом;<\/li>\n<li><tt>ecmascript<\/tt> или <tt>x-ecmascript<\/tt> — тоже понятно, ДжаваСкрипт — расширение этого языка;<\/li>\n<li><tt>jscript<\/tt> — диалект языка в «Эксплорере», считается, что другие браузеры сейчас его тоже «знают», хотя на деле есть нюансы, но всем уже всё равно;<\/li>\n<li>от <tt>javascript1.0<\/tt> до <tt>javascript1.5<\/tt> — когда-то указанием версии можно было разделять скрипты по <a href=\"https:\/\/bolknote.ru\/all\/js-new13-shtml\/\">уровню<\/a> поддержки языка в браузере;<\/li>\n<li><tt>livescript<\/tt> — старое название языка «ДжаваСкрипта», я ещё помню времена, когда это значение использовалось, хотя и редко.<\/li>\n<\/ul>\n<p>Сейчас, конечно, это скорее археология, чем какое-то нужное знание.<\/p>\n",
            "date_published": "2025-03-19T21:40:41+05:00",
            "date_modified": "2025-03-19T21:40:37+05:00",
            "tags": [
                "html",
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 19 Mar 2025 21:40:41 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "135283",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "133656",
            "url": "https:\/\/bolknote.ru\/all\/doompdf\/",
            "title": "DoomPDF",
            "content_html": "<p>Четверть века назад я <a href=\"https:\/\/bolknote.ru\/all\/2912\/\">писал<\/a> о «Думе», запущенном на фотоаппарате. Тогда меня это очень удивило и восхитило. Но с тех пор много времени утекло, «Дум» на чём только не запускали и это удивляло всё меньше. Не помню когда в последний раз, пробегая глазами подобную новость, я думал хотя бы «надо же».<\/p>\n<p>Но <a href=\"https:\/\/github.com\/ading2210\/doompdf\">«Дум», запущенный внутри <i>PDF<\/i>-файла<\/a>, меня чертовски удивил! Не то, чтобы я не знал, что это возможно — в конце-концов, <i>PDF<\/i> сам по себе программный файл (там внутри язык программирования <a href=\"https:\/\/bolknote.ru\/all\/99-butylok-postscript\/\"><i>PostScript<\/i><\/a>), но я как-то даже и не думал о такой возможности.<\/p>\n<p>Вы попробуйте, работает даже внутри браузера!<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2025.01.14@2x.jpg\" width=\"1000\" height=\"804\" alt=\"\" \/>\n<\/div>\n<p>Правда, в данном случае <i>PostScript<\/i> почти не использовался. Всё дело в том, что внутри <i>PDF<\/i> есть возможность использовать ещё и <i>JavaScript<\/i>. Причём, в случае <i>Adobe Acrobat<\/i>, доступны, например, такие, сомнительные для <i>PDF<\/i> возможности, как 3Д-графика или <i>HTTP<\/i>-запросы.<\/p>\n<p>В просмотрщиках <i>PDF<\/i> современных браузеров поддержка <i>JavaScript<\/i> тоже есть, правда она сильно ограничена по функционалу. Тем не менее, для запуска «Дума» хватило и этого.<\/p>\n<p>Чтобы запустить «Дум» внутри <i>PDF<\/i>, использовался старый <i>Emscripten<\/i>, который компилирует код на Си в <tt>asm.js<\/tt> (это такое подмножество <i>JavaScript<\/i>), вместо более привычного <i>WebAssembly<\/i>. Но этого недостаточно — нужно было придумать, как принимать ввод с клавиатуры и отображать графику. Это оказалось не таким уж и простым. К счастью, в браузерах <i>PDF<\/i>-движки поддерживают текстовые поля и кнопки, что и было использовано для ввода.<\/p>\n<p>С графикой возникли следующие проблемы. Речь идет о разрешении 320×200 пикселей, что означает, что если бы использовались обычные текстовые поля для каждого пикселя, пришлось бы обновлять тысячи полей на каждый кадр. В общем, так бы вы никогда не поиграли в «Дум». Вместо этого автор решил использовать одно текстовое поле на каждую строку экрана и обновлять их с помощью <i>ASCII<\/i>-символов. Простой, но довольно эффективный способ, который дает в итоге монохромную картинку с шестью цветами. Конечно, такой способ тоже не даёт плавного рендера картинки, но играть всё равно довольно комфортно!<\/p>\n",
            "date_published": "2025-01-14T11:00:38+05:00",
            "date_modified": "2025-01-14T11:28:36+05:00",
            "tags": [
                "javascript",
                "pdf"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 14 Jan 2025 11:00:38 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "133656",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "133493",
            "url": "https:\/\/bolknote.ru\/all\/unsnow-2\/",
            "title": "UnSnow 2",
            "content_html": "<p>Полтора десятилетия назад я <a href=\"https:\/\/bolknote.ru\/all\/1565\/\">написал скрипт «<i>UnSnow<\/i>»<\/a>, выключающий снежинки, которыми иногда украшают сайты. Мне очень нравится Новый год и новогодняя движуха, но эти снежинки частенько раздражают, тем более, что их нередко делают крупными и навязчивыми.<\/p>\n<p>За столько лет способы, которыми фронтендеры добавляют на сайт снежинки, сильно изменились, поэтому прежний скрипт перестал работать, но снежинки никуда не делись. Так как за эти годы никто не поднял упавшее знамя борьбы с визуальным безумием, придётся мне.<\/p>\n<p>Новая версия скрипта можем замедлять некоторые сайты, зато, кажется, справляется с любыми случаями падения вкуса. В браузер скрипт можно установить при помощи плагина <i>Tampermonkey<\/i> или любого другого, умеющего выполнять <i>UserScript<\/i>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">\/\/ ==UserScript==\n\/\/ @name         UnSnow\n\/\/ @author       Evgeny Stepanischev aka Bolk\n\/\/ @version      2024-12-31\n\/\/ @namespace    \/files\/unsnow2.js\n\/\/ @description  Turn off stupid snow\n\/\/ @match        *:\/\/*\/*\n\/\/ @grant        none\n\/\/ ==\/UserScript==\n\n(function() {\n    &#039;use strict&#039;;\n\n    if (window.location.hostname === &#039;aliexpress.ru&#039;) {\n        return;\n    }\n\n    Array.from(document.querySelectorAll(&#039;*&#039;)).forEach(e =&gt; {\n        for (let a of e.attributes) {\n            if (\/(?&lt;!un)snow\/i.test(a.name + a.value)) {\n                e.style = &#039;visibility:hidden;position:absolute;margin-left:-10000px;&#039; +\n                          &#039;display:none;transform:translateX(-100vw);opacity:0&#039;;\n            }\n        }\n    });\n})();<\/code><\/pre>",
            "date_published": "2024-12-31T17:16:06+05:00",
            "date_modified": "2025-01-01T14:22:37+05:00",
            "tags": [
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 31 Dec 2024 17:16:06 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "133493",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "129161",
            "url": "https:\/\/bolknote.ru\/all\/poseschal-li-polzovatel-sayt\/",
            "title": "Посещал ли пользователь сайт?",
            "content_html": "<p style=\"background: rgb(222, 235, 217); padding: 10px; color:#000\">Атака не работает — в браузерах <a href=\"https:\/\/developer.chrome.com\/blog\/http-cache-partitioning?hl=ru\">давно реализована защита<\/a>, у меня идея «сработала» в силу того, что я не выполнил все необходимые проверки.<\/p>\n<p>В прошлом было достаточно много методов определить ходил ли пользовать на какой-то сайт или нет. В основном, идея была проста: у себя на сайте через <i>CSS<\/i> каким-то способом выделяем посещённые (<tt>:visited<\/tt>) ссылки — например, делаем таким ссылкам шрифт больше, а потом через ДжаваСкрипт смотрим у каких ссылок ширина стала больше расчётной.<\/p>\n<p>Это считалось проблемой, поэтому свойство изменили так, чтобы никакой утечки информации о посещении в ДжаваСкрипт не происходило. Все современные браузеры уже много лет от этого защищены.<\/p>\n<p>Но недавно меня осенило, что есть способ обойти эту защиту!<\/p>\n<p>Ведь если пользователь посещал целевой сайт, то скорее всего какие-то его ресурсы легли в кеш. Если найти какой-то ресурс этого сайта большого размера, загрузить его и попытаться определить за какое время это произошло, то по этой разнице можно понять — был он в кеше или нет.<\/p>\n<p>Я попробовал сделать это с «Гитхабом». Самый большой файл, который загружается там с первой страницей — <tt>vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_primer_octicons-react_di-b40d97-9b98c5140e22.js<\/tt>. Занимает он 136 килобайт, вполне подходящий размер.<\/p>\n<p>Как же определить момент когда он загрузится? Если посмотреть внутрь, видно, что он после скачивания создаёт свойство <tt>webpackChunk<\/tt> в объекте <tt>globalThis<\/tt>. Если перехватить обращение к этому свойству, можно понять, что файл загружен:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">const t = new Date();\nObject.defineProperty(globalThis, &#039;webpackChunk&#039;, {\n  set: function() {\n    console.log(new Date() - t);\n  }\n});<\/code><\/pre><p>Ниже этого кода подключаем загрузку указанного файла прямо с «Гитхаба» через тег <tt>&lt;script&gt;<\/tt> и дело в шляпе.<\/p>\n<p>Я проверил, если очистить кеш браузера, то файл у меня загружается примерно за 100—400 миллисекунд, если берётся из кеша — это 0—12. Легко отличить одно от другого.<\/p>\n",
            "date_published": "2024-07-05T20:01:23+05:00",
            "date_modified": "2024-07-07T21:37:52+05:00",
            "tags": [
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 05 Jul 2024 20:01:23 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "129161",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "127771",
            "url": "https:\/\/bolknote.ru\/all\/slozhnosti-proverki-versiy\/",
            "title": "Сложности проверки версий",
            "content_html": "<p>Случайно обратил внимание какое-то время назад, что у меня на сайте почему-то перестало проигрываться аудио в формате <i>MP3<\/i> в «Опере», моём основном браузере. Никак не доходили руки разобраться, но в эти длинные праздники я всё-таки докопался до сути. Суть оказалось смешной до нелепого.<\/p>\n<p>Дело в том, что в движке, который я использую для своего дневника, для проигрывания аудио используется библиотека «<a href=\"https:\/\/github.com\/ilyabirman\/Jouele\">Жуэль<\/a>», а её текущая версия, в свою очередь использует старую версию библиотеки «<a href=\"https:\/\/github.com\/goldfire\/howler.js\"><i>howler.js<\/i><\/a>», в которой есть вот такой код:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">self._navigator = (typeof window !== &#039;undefined&#039; &amp;&amp; window.navigator) ? window.navigator : null;\nvar checkOpera = self._navigator &amp;&amp; self._navigator.userAgent.match(\/OPR\\\/([0-6].)\/g);\nvar isOldOpera = (checkOpera &amp;&amp; parseInt(checkOpera[0].split(&#039;\/&#039;)[1], 10) &lt; 33);<\/code><\/pre><p>Проблема в регулярном выражении <tt>OPR\\\/([0-6].)<\/tt> и в версии «Оперы». Недавно версия перевалила за 100 и эта регулярка, вместо корректного номера, стала возвращать «10».<\/p>\n<p>Из-за этого третья строка считает мою «Оперу» слишком старой (потому что 10 меньше 33), чтобы поддерживать проигрывание файлов <i>MP3<\/i>.<\/p>\n<p>Заменил у себя на сайте <i>howler.js<\/i> на актуальную версию и всё заработало. Заодно предложил патч в «Жуэль», надеюсь примут оперативно.<\/p>\n",
            "date_published": "2024-05-02T20:24:26+05:00",
            "date_modified": "2024-05-02T20:26:00+05:00",
            "tags": [
                "javascript",
                "программирование",
                "Эгея"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 02 May 2024 20:24:26 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "127771",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "136574",
            "url": "https:\/\/bolknote.ru\/all\/4620\/",
            "title": "F★ckJS на поло",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2017.08.08@2x.jpg\" width=\"640\" height=\"360\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Поло с программой на ДжаваСкрипте, написанной четыре года назад<\/div>\n<\/div>\n<p>Очень в тему к <a href=\"https:\/\/bolknote.ru\/all\/4619\/\">предыдущему посту<\/a> на работе нашёлся мешок с поло размера <i>XXL<\/i> (из-за размера и сохранился, остальные разобрали).<\/p>\n<p>На поло программа на ДжаваСкрипте, которую я писал к какому-то событию, должно быть готовились к какой-то конфереции — если её запустить в консоли браузера, появляется надпись «<i>prihodite rabotat 88002005221<\/i>». У меня в «исходящих» сохранилось письмо от 11 марта 2013 года, где я высылаю оригинал этой программы нашему дизайнеру, четыре года уже прошло, надо же.<\/p>\n",
            "date_published": "2017-08-08T12:11:00+05:00",
            "date_modified": "2025-07-08T17:39:59+05:00",
            "tags": [
                "*fuck",
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 08 Aug 2017 12:11:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "136574",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124867",
            "url": "https:\/\/bolknote.ru\/all\/3954\/",
            "title": "JavaScript, совмещённый с Brainf*ck: «hello friends»",
            "content_html": "<p>Помните моё поздравление с <a href=\"\/2012\/01\/05\/~3535\/\">Новым годом<\/a>, написанное на запутанном Джаваскрипте? Такой же принцип я использовал для привлекающего внимание <a href=\"https:\/\/twitter.com\/bolknote\/status\/315333227718012929\/photo\/1\">баннера нашей компании<\/a>.<\/p>\n<p>Я давно уже заметил, что это сильно похоже на язык <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Brainfuck\">Брейнфак<\/a>. Давно хотелось попробовать смешать эти два языка в одном листинге. Со стороны Брейнфака всё довольно гладко — надо только балансировать квадратные скобки (но Джаваскрипт требует того же) и избегать вечных циклов (тут уже сложнее, так как листинги на запутанном Джаваскрипте часто требуют пустых циклов), незнакомые символы этот язык пропускает. В Джаваскрипте синтаксис построже, там нужно было помучаться больше.<\/p>\n<p>Получилась следующая программа (используется расцветка для Брейнфака, чтобы было видно какие части программы он пропускает):<\/p>\n<pre class=\"e2-text-code\"><code class=\"hljs lang-plaintext\">($=!{}<span class=\"hljs-meta\">[<\/span>\/<span class=\"hljs-meta\">-<\/span>\/<span class=\"hljs-meta\">+<\/span>\/\\<span class=\"hljs-meta\">+<\/span>@<span class=\"hljs-meta\">+<\/span>@<span class=\"hljs-meta\">+<\/span>!<span class=\"hljs-meta\">+<\/span>\/)<span class=\"hljs-meta\">-<\/span>!{$:\/<span class=\"hljs-meta\">&gt;<\/span>\/<span class=\"hljs-meta\">+<\/span>\/!<span class=\"hljs-meta\">&gt;<\/span>\/<span class=\"hljs-meta\">+<\/span>\/<span class=\"hljs-meta\">&lt;<\/span>\/}<span class=\"hljs-meta\">+<\/span>\n(_=!<span class=\"hljs-meta\">-<\/span>{}<span class=\"hljs-meta\">-<\/span>$<span class=\"hljs-meta\">+<\/span>\/<span class=\"hljs-meta\">&gt;<\/span>\/)<span class=\"hljs-meta\">-<\/span>~(\/<span class=\"hljs-meta\">&lt;<\/span>\/)<span class=\"hljs-meta\">+<\/span>\n(_$=<span class=\"hljs-meta\">-<\/span>$<span class=\"hljs-meta\">-<\/span>{}<span class=\"hljs-meta\">-<\/span>$<span class=\"hljs-meta\">+<\/span>\/<span class=\"hljs-meta\">&gt;<\/span>\/)<span class=\"hljs-meta\">[<\/span>$$=<span class=\"hljs-meta\">-<\/span>(~<span class=\"hljs-meta\">-<\/span>~$<span class=\"hljs-meta\">+<\/span>~<span class=\"hljs-meta\">-<\/span>~$<span class=\"hljs-meta\">-<\/span>!<span class=\"hljs-meta\">+<\/span>{$:\/!<span class=\"hljs-meta\">&lt;<\/span>\/})<span class=\"hljs-meta\">+<\/span>\n_<span class=\"hljs-meta\">[<\/span>$$<span class=\"hljs-meta\">+<\/span>=~<span class=\"hljs-meta\">-<\/span>~{$:\/<span class=\"hljs-meta\">]<\/span>\/}<span class=\"hljs-meta\">+<\/span>\n_$<span class=\"hljs-meta\">-<\/span>~{}<span class=\"hljs-meta\">+<\/span>\n_$<span class=\"hljs-meta\">[<\/span>$$<span class=\"hljs-meta\">+<\/span>~{_:<span class=\"hljs-meta\">-<\/span>$<span class=\"hljs-meta\">&gt;<\/span>\/<span class=\"hljs-meta\">]<\/span>\/}<span class=\"hljs-meta\">+<\/span>\n$<span class=\"hljs-meta\">-<\/span>$$<span class=\"hljs-meta\">]<\/span><\/code>\n<\/pre>\n<p>Оба интерпретатора выполняют её с разным результатом, Брейнфак выводит «<i>hello<\/i>», а Джаваскрипт — «<i>friends<\/i>»:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">bolk@Bolk ~$ .\/brainfuck &lt;&lt;&lt;&#039;($=!{}+[\/-\/]+\/\\+@+@+!+\/)[-!{$:\/&gt;\/+\/!+&gt;\/+\/&lt;&lt;\/}]+(_=!-{}+[-$]+\/&gt;\/)[-~(\/&gt;[-&gt;+&gt;+&lt;&lt;]&gt;&gt;[-&lt;+&lt;+&gt;&gt;]&lt;&lt;&lt;\/)]+(_$=[-$][-{}]+[-$]+\/&gt;&gt;\/)\n[$$=-(~-~$+~-~$-!+{$:\/!+&gt;+&gt;+&gt;+&gt;+&gt;+&lt;&lt;&lt;&lt;&lt;\/})]+_[$$+=~-~{$:\/[-&gt;++++&gt;+&gt;++++++++&gt;++++++++&gt;+++++++++++[&lt;]]\/}]+_$[-~{}]+_$[$$+~{_:-$&gt;\/[.&gt;]\/}]+$[-+-$$]&#039;\n\nhello\n\nbolk@Bolk ~$ v8 -e &#039;print(($=!{}+[\/-\/]+\/+@+@+!+\/)[-!{$:\/&gt;\/+\/!+&gt;\/+\/&lt;&lt;\/}]+(_=!-{}+[-$]+\/&gt;\/)[-~(\/&gt;[-&gt;+&gt;+&lt;&lt;]&gt;&gt;[-&lt;+&lt;+&gt;&gt;]&lt;&lt;&lt;\/)]+(_$=[-$][-{}]+[-$]+\/&gt;&gt;\/)\n[$$=-(~-~$+~-~$-!+{$:\/!+&gt;+&gt;+&gt;+&gt;+&gt;+&lt;&lt;&lt;&lt;&lt;\/})]+_[$$+=~-~{$:\/[-&gt;++++&gt;+&gt;++++++++&gt;++++++++&gt;+++++++++++[&lt;]]\/}]+_$[-~{}]+_$[$$+~{_:-$&gt;\/[.&gt;]\/}]+$[-+-$$])&#039;\n\nfriends<\/code><\/pre><p>Повозиться пришлось прилично, если честно, некоторые конструкции ДжЭс делит с Брейфаком (большинство квадратных скобок), а кое-где торчат чистые инструкции Брейнфака, засунутые в те места программы, где они не могут помешать своему соседу. Пустые циклы, которые образуются квадратными скобками я старался сводить к операции зануления ячейки („[-]“), сильно мешали плюсы, используемые в Джаваскрипте для объединения букв — они увеличивали содержимое ячейки в Брейнфаке на единицу, это приходилось учитывать.<\/p>\n<p>Слово «<i>friends<\/i>» я выбрал потому что его легко записать:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">&quot;false&quot;[0]+&quot;true&quot;[1]+&quot;undefined&quot;[5]+&quot;true&quot;[3]+&quot;undefined&quot;[1]+&quot;undefined&quot;[2]+&quot;false&quot;[3]<\/code><\/pre><\/pre><p>Принцип я когда-то более-менее <a href=\"\/2012\/01\/05\/~3535\/#n32932\">подробно разбирал<\/a>.<\/p>\n",
            "date_published": "2013-04-28T16:44:00+05:00",
            "date_modified": "2023-12-12T13:29:42+05:00",
            "tags": [
                "*fuck",
                "bf",
                "brainfuck",
                "javascript"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 28 Apr 2013 16:44:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124867",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124868",
            "url": "https:\/\/bolknote.ru\/all\/3793\/",
            "title": "Brainf★ck в highlight.js",
            "content_html": "<p>Я как-то <a href=\"\/2012\/09\/13\/~3740\/\">писал<\/a>, что ко Дню программиста сделал подсветку синтаксиса языка <i>Brainfuck<\/i> для библиотеки <i>highlight.js<\/i>.<\/p>\n<p>Оказывается, я пропустил выход версии 7.3, куда вошла моя подсветка, теперь <i>Brainfuck<\/i> <a href=\"http:\/\/softwaremaniacs.org\/soft\/highlight\/en\/download\/\">входит<\/a> в список поддерживаемых языков.<\/p>\n",
            "date_published": "2012-11-11T17:45:00+05:00",
            "date_modified": "2023-12-12T13:29:48+05:00",
            "tags": [
                "bf",
                "brainfuck",
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 11 Nov 2012 17:45:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124868",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "135490",
            "url": "https:\/\/bolknote.ru\/all\/3384\/",
            "title": "Компания «Нетскейп» была первой в деле серверного Джаваскрипта",
            "content_html": "<p>Чувствую себя археологом. После утренних изысканий за тарелкой пельменей, мне <a href=\"https:\/\/bolknote.ru\/all\/3381\/\">удалось установить<\/a> точную дату релиза (уже добавил в «Википедию») <i>Netscape Enterprise Server 2.0<\/i> — 5 марта 1996 года. Именно в этом сервере <a href=\"http:\/\/en.wikipedia.org\/wiki\/SSJS\">впервые появился<\/a> серверный Джаваскрипт.<\/p>\n<p>Вторая (по всей видимости) реализация была у Микрософт — в «Википедии» <a href=\"http:\/\/en.wikipedia.org\/wiki\/JScript#JScript\">написано<\/a>, что версия <i>JScript<\/i> для <i>IIS<\/i> стала доступна в январе 1997 года.<\/p>\n<p>Кстати, публичная бета <i>ASP<\/i> <a href=\"https:\/\/web.archive.org\/web\/20100113154702\/http:\/\/ondotnet.com\/pub\/a\/dotnet\/2005\/09\/19\/what-is-asp-net.html#brief_history\">появилась<\/a> много раньше — в октябре 1996, как апгрейд для <i>IIS 2.0<\/i>. Но сайты можно было разрабатывать только на <i>VBScript<\/i>.<\/p>\n<p>Так что в этом году исполнилось 15 лет серверному Джаваскрипту.<\/p>\n",
            "date_published": "2011-08-30T12:34:00+05:00",
            "date_modified": "2025-04-08T15:48:45+05:00",
            "tags": [
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 30 Aug 2011 12:34:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "135490",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "134081",
            "url": "https:\/\/bolknote.ru\/all\/2597\/",
            "title": "Wolf 5k strikes back",
            "content_html": "<p>Забавная была игрушка «<a href=\"https:\/\/web.archive.org\/web\/20031205101316\/http:\/\/www.wolf5k.com\/\">Wolf5K<\/a>». Это игра на JavaScript, занимающая пять килобайт (!). Был такой конкурс когда-то — «The 5K», цель — уместить что-нибудь толковое в 5 килобайт.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2010.06.27.png\" width=\"149\" height=\"115\" alt=\"\" \/>\n<\/div>\n<p>Ребята произвели фурор тогда, они уместили в этот размер небольшую псевдотрёхмерную бродилку. Никаких CANVAS! Хитрость в том, что вся графика (кроме кровищи) делается в формате XBM и передаётся тегу IMG через схему «javascript». Игрушка работала в IE5, IE6, Mozilla 1.1+ и Netscape 4.77 для Мака.<\/p>\n<p>Формат XBM — это текстовый формат чёрно-белых картинок (я даже когда-то <a href=\"\/files\/xbm\/\">делал библиотеку для PHP Image::XBM<\/a>). Его удалили из IE в SP2, работает ли это до сих пор в Gecko-браузерах я не знаю (у меня сейчас не установлен FF, а ставить лень), а «Опера» не читает графику через схему «javascript», так как никогда не делает попыток угадать контент по содержанию. Только по MIME-типу.<\/p>\n<p>В общем, захотелось мне почему-то вспомнить эту игрушку, а она у меня не работает. Ну, делов-то. Заменить схему «javascript» на чуть доработанную «data». Вот патч, нужно открыть окно игры, скопировать его в строку браузера и нажать «Enter»:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">javascript:void(eval(X.toString().replace(\/&quot;j.*?;&quot;\/, &#039;&quot;data:image\/x-xbitmap,&quot; + encodeURI(im)&#039;)))<\/code><\/pre><\/pre><p>В IE по-прежнему работать не будет (в нём нет XBM), в «Хроме» тоже не должно, в «Опере» — заработает. Если у кого-нибудь установлено что-то ещё, попробуйте и скажите получилось ли.<\/p>\n<p><i>Добавлено утром<\/i>: читатели сообщают, что в «Сафари» тоже работает.<\/p>\n",
            "date_published": "2010-06-27T04:12:00+05:00",
            "date_modified": "2025-02-08T16:38:06+05:00",
            "tags": [
                "javascript",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 27 Jun 2010 04:12:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "134081",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119180",
            "url": "https:\/\/bolknote.ru\/all\/js-new13-shtml\/",
            "title": "Что нового в JavaScript версии 1.3 от Netscape",
            "content_html": "<p style=\"background: rgb(222, 235, 217); padding: 10px; color:#000\">Заметка была впервые <a href=\"http:\/\/citforum.ru\/internet\/javascript\/js_new13.shtml\">опубликована<\/a> на сайте «Цитфорум» в 1999-м году, дата публикации примерно восстановлена из «Веб-архива»<\/p>\n<p>Язык <i>JavaScript 1.3<\/i> поддерживается <i>Navigator<\/i>’ом версий 4.06 и 4.5.<\/p>\n<h2>Поддержка Unicode<\/h2>\n<p>В строках теперь стало возможным использование любых символов из таблицы <i>Unicode<\/i>, которые кодируются как шесть <i>ASCII<\/i>-символов: <tt>\\u<\/tt> и 4 цифры в шестнадцатеричной кодировке, например, <tt>\\u0041<\/tt> — латинская буква «A» из таблицы <i>Unicode<\/i>. Каждая такая последовательность добавляет только один символ к строке. Функции <tt>escape<\/tt> и <tt>unescape<\/tt> не подвергались изменениям и не используют <i>Unicode<\/i>-последовательности.<\/p>\n<p>Следующий пример выведет на экран символ «копирайт» и строку «<i>Netscape Communicator<\/i>»:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">alert(&quot;\\u00A9 Netscape Communicator&quot;);<\/code><\/pre><p>Следующая таблица содержит список наиболее часто используемых специальных символов и их коды в Unicode:<\/p>\n<div class=\"e2-text-table\">\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n<tr>\n<td>Unicode<\/td>\n<td>Наименование<\/td>\n<td style=\"text-align: center\"><\/td>\n<\/tr>\n<tr>\n<td>\\u0009<\/td>\n<td>Tab<\/td>\n<td><TAB><\/td>\n<\/tr>\n<tr>\n<td>\\u000B<\/td>\n<td>Vertical Tab<\/td>\n<td>&lt;VT&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u000C<\/td>\n<td>Form Feed<\/td>\n<td>&lt;FF&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u0020<\/td>\n<td>Space<\/td>\n<td>&lt;SP&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u000A<\/td>\n<td>Line Feed<\/td>\n<td>&lt;LF&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u000D<\/td>\n<td>Carriage Return<\/td>\n<td>&lt;CR&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u000b<\/td>\n<td>Back Space<\/td>\n<td>&lt;BS&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u0009<\/td>\n<td>Horizontal Tab<\/td>\n<td>&lt;HT&gt;<\/td>\n<\/tr>\n<tr>\n<td>\\u0022<\/td>\n<td>Double Quote<\/td>\n<td>&quot;<\/td>\n<\/tr>\n<tr>\n<td>\\u0027<\/td>\n<td>Single Quote<\/td>\n<td>`<\/td>\n<\/tr>\n<tr>\n<td>\\u005C<\/td>\n<td>Backslash<\/td>\n<td>\\<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>Вы можете использовать <i>Unicode<\/i> для отображения символов в различных языках или технических символов. Для отображения символов <i>Unicode<\/i> у клиента должны быть установлены шрифты <i>Unicode<\/i>. Некоторые ОС, например <i>Windows 95<\/i>, поддерживают <i>Unicode<\/i> лишь частично.<\/p>\n<h2>Новые свойства объекта Global<\/h2>\n<h3>NaN<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>NaN<\/tt><\/p>\n<p>В <i>JavaScript 1.2<\/i> значение <tt>NaN<\/tt> (<i>Not-a-Number<\/i>) было определено только для объекта <tt>Number<\/tt>, в версии 1.3 это значение также определено, и для объекта <tt>global<\/tt>. <tt>NaN<\/tt> никогда не равно ни одному другому числу, включая <tt>NaN<\/tt>. Функции, работающие с числами (например <tt>Number.constructor<\/tt>, <tt>parseFloat<\/tt> и <tt>parseInt<\/tt>) возвращает <tt>NaN<\/tt>, если значение параметра не числовое.<\/p>\n<h3>Infinity<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>Infinity<\/tt><\/p>\n<p>Числовое значение величины <tt>Infinity<\/tt> — бесконечность. В <i>JavaScript 1.2<\/i> <tt>Infinity<\/tt> было определено как свойство объекта <tt>Number<\/tt>. У объекта <tt>Number<\/tt> есть два свойства <tt>POSITIVE_INFINITY<\/tt> и <tt>NEGATIVE_INFINITY<\/tt> (для примера, <tt>Number.POSITIVE_INFINITY<\/tt>). В <i>JavaScript 1.3<\/i> <tt>Infinity<\/tt> определено и для объекта <tt>Global<\/tt>. Значение <tt>Infinity<\/tt> (положительная бесконечность) всегда больше, чем любое другое число, включая себя. <tt>Infinity<\/tt> полностью соответствует математической бесконечности. Например любое число, умноженное на <tt>Infinity<\/tt>, есть <tt>Infinity<\/tt>, любое число, деленное на <tt>Infinity<\/tt>, есть 0.<\/p>\n<h3>undifined<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>undefined<\/tt><\/p>\n<p>Переменные, которым не было присвоено значение, имеют значение <tt>undefined<\/tt>. Теперь вы можете использовать <tt>undefined<\/tt> для проверки того, было ли присвоено переменной значение. Методы и выражения <i>JavaScript<\/i> также возвращают значение <tt>undefined<\/tt>, если используемые переменные не имеют своего значения. <tt>undefined<\/tt> — это свойство объекта <tt>Global<\/tt>, которое имеет значение <tt>undefined<\/tt>.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">var input;\r\nif(input == undefined){\r\n    document.write(&quot;переменной input значение не присвоено&quot;);\r\n}<\/code><\/pre><h2>Новые функции объекта Global (IsFinite)<\/h2>\n<h3>IsFinite<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>IsFinite(число)<\/tt><\/p>\n<p>Вы можете использовать эту функцию, для определения конечности числа. Если аргумент функции <tt>NaN<\/tt> положительная или отрицательная бесконечность, функция возвращает <tt>false<\/tt>, иначе она возвращает <tt>true<\/tt>.<\/p>\n<p>Пример:<br \/>\nПроверка числа на конечность<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">if(isFinite(Input) == true)\r\n{\r\n    \/\/ Ваш код\r\n}<\/code><\/pre><h2>Метод toSource<\/h2>\n<h4>Синтаксис<\/h4>\n<p><tt>toSource()<\/tt><\/p>\n<p>Это новый метод, определенный для всех встроенных объектов. Большинство объектов наследуют этот метод от <tt>Object<\/tt>. Метод <tt>toSource<\/tt> базируется на методе <tt>toString<\/tt> объектов <tt>Object<\/tt> и <tt>Array<\/tt>.<\/p>\n<p><tt>toSource<\/tt> возвращает строку, которой вы создавали объект. Вы можете подставлять это значение в функцию <tt>eval<\/tt>, сохранять его и др. Для объекта <tt>tools<\/tt> метод <tt>eval(tools.toSource())<\/tt> вернет копию объекта <tt>tools<\/tt>. Если <tt>tools<\/tt> содержит рекурсивные свойства, то строка, которую вернет функция <tt>toSource()<\/tt> может выглядеть странно.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">product = {type: &quot;electronic&quot;, value: 500};\r\nmyList = [&quot;school&quot;, 4, &quot;home&quot;, 10];\r\nmyBool = new Boolean; \r\nmyString = new String(&quot;my line&quot;);\r\nmyDate = new Date();\r\ndocument.write(product.toSource());\r\ndocument.write(myList.toSource());\r\ndocument.write(myBool.toSource());\r\ndocument.write(myString.toSource());\r\ndocument.write(myDate.toSource());<\/code><\/pre><h2>Расширение объекта Date<\/h2>\n<p>В предыдущих версиях <i>JavaScript<\/i> формат даты был зависим от платформы и различных установок. В новой реализации объект <tt>Date<\/tt> полностью платформонезависим. Объект <tt>Date<\/tt> теперь поддерживает дату и время в формате <i>UTC<\/i> (<i>Universal Coordinated Time<\/i>). Дата задается как количество миллисекунд, прошедших с 1 января 1970 года. День содержит 86400000 миллисекунд.<\/p>\n<p>Следующий пример возвращает разницу между <tt>timeA<\/tt> и <tt>timeB<\/tt> в миллисекундах:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">timeA = new Date(); \r\nalert(&quot;подождем какое-то время&quot;);\r\ntimeB = new Date(); \r\ntimeDifference = timeB - timeA;<\/code><\/pre><p>Для работы с миллисекундами были добавлены методы <tt>getMilliseconds()<\/tt> и <tt>setMilliseconds(num_ms)<\/tt>, <tt>getUTCMilliseconds()<\/tt> и <tt>setUTCMilliseconds(num_ms)<\/tt>. Для устранения проблеммы 2000 года добавлены функции <tt>setFullYear<\/tt>, <tt>getFullYear<\/tt>, <tt>setUTCFullYear<\/tt> и <tt>getUTCFullYear<\/tt>. <tt>getFullYear<\/tt> возвращает полный год, например 1998, а <tt>setFullYear<\/tt> — устанавливает. Методы <tt>setYear<\/tt> и <tt>getYear<\/tt> оставлены для обратной совместимости.<\/p>\n<h2>Новый конструктор объекта Date<\/h2>\n<p>Конструктор объекта <tt>Date<\/tt> был расширен для поддержки миллисекунд, его полный формат:<\/p>\n<p><tt>Date (yr_num, mo_num, day_num, [, hr_num[, min_ num[, sec_num[, ms_num]]]])<\/tt><\/p>\n<h2>UTC<\/h2>\n<p><tt>UTC<\/tt> — метод объекта <tt>Date<\/tt>, теперь также поддерживает миллисекунды.<\/p>\n<p><tt>Date.UTC(year, month, date, [, hours[, min[, sec[, ms]]]])<\/tt><\/p>\n<p>Для поддержки <i>UTC<\/i> были введены <tt>getUTCFullYear()<\/tt>, <tt>getUTCMonth()<\/tt>, <tt>getUTCDate()<\/tt>, <tt>getUTCDay()<\/tt>, <tt>getUTCHour()<\/tt>, <tt>getUTCMinutes()<\/tt>, <tt>getUTCSeconds()<\/tt>, <tt>getUTCMilliseconds()<\/tt>, <tt>setUTCFullYear(year [, month[, date]])<\/tt>, <tt>setUTCMonth(month[, date])<\/tt>, <tt>setUTCDate(date)<\/tt>, <tt>setUTCHour(hours[, min[, sec[,ms]]])<\/tt>, <tt>setUTCMinutes(min[, sec[, ms]])<\/tt>, <tt>setUTCSeconds(sec [, ms])<\/tt>, <tt>setUTCMilliseconds(ms)<\/tt> и <tt>toUTCString()<\/tt> ( превращает дату в строку, используя соглашение <i>Universal Coordinates Time<\/i>). Рассматривать эти методы более подробно не имеет смысла, их предназначение вполне понятно из названия.<\/p>\n<h2>Изменения в методах объекта Date<\/h2>\n<p>Методы объекта <tt>Date<\/tt> в версии 1.3 получили дополнительные параметры:<\/p>\n<p><tt>setMonth(month[, date])<\/tt><br \/>\n<tt>setHours(hours[, min[, sec[, ms]]])<\/tt><br \/>\n<tt>setMinutes(min[, sec[, ms]])<\/tt><br \/>\n<tt>setSeconds(sec[, ms])<\/tt><br \/>\nТеперь эти методы по своей форме полностью эквивалентны методам <tt>setUTC-<\/tt>.<\/p>\n<h2>Новые методы объекта Function<\/h2>\n<h3>call<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>call(thisArg, arg1, arg2, ...)<\/tt><\/p>\n<h4>Параметры<\/h4>\n<p><tt>thisArg<\/tt> —вызываемый объект<br \/>\n<tt>arg1, arg2,…<\/tt> — параметры вызываемого объекта<\/p>\n<p><tt>call<\/tt> позволяет вызывать методы одних объектов в контексте других (вызвавших) объектов. Это дает возможность задать свое значение объекту <tt>this<\/tt>, при вызове функции и, что самое главное, метод <tt>call<\/tt> позволяет написать метод один раз и наследовать его для других объектов не переписывая их! (См. также <tt>apply<\/tt>).<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">function product(name, value)\r\n{\r\n\tthis.name = name;\r\n\tif(value &gt; 1000) this.value = 999; else this.value = value;\r\n}\r\nfunction prod_dept(name, value, dept)\r\n{\r\n\tthis.dept = dept;\r\n\tproduct.call(this, name, value);\r\n}\r\nprod_dept.prototype = new product();\r\ncheese = new prod_dept(feta, 5, food);  \r\ncar = new prod_dept(honda, 5000, auto);<\/code><\/pre><h3>apply<\/h3>\n<h4>Синтаксис<\/h4>\n<p><tt>apply(thisArg, argArray)<\/tt><\/p>\n<h4>Параметры<\/h4>\n<p><tt>thisArg<\/tt> — вызываемый объект<br \/>\n<tt>arg1, arg2,…<\/tt> — параметры вызываемого объекта<\/p>\n<p><tt>apply<\/tt> позволяет применять методы одних объектов в контексте других (вызывающих). Так же как и в <tt>call<\/tt> объект <tt>this<\/tt> может принимать заданное значение (<tt>this<\/tt> будет указывать на текущий, вызвавший объект). <tt>apply<\/tt> очень напоминает <tt>call<\/tt>, отличие лишь в типах параметров (аргументов) вызываемого объекта. В методе <tt>apply<\/tt> возможно использование любых типов массивов. Например: <tt>apply(this, new Array(name, value))<\/tt>. Разрешается так же использовать свойства вызываемого объекта. Можно использовать <tt>arguments<\/tt> для передачи всех параметров вызываемому объекту.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">function product(name, value)\r\n{\r\n\tthis.name = name;\r\n\tif(value &gt; 1000) this.value = 999; else\r\n\tthis.value = value;\r\n}\r\nfunction prod_dept(name, value, dept)\r\n{\r\n\tthis.dept = dept;\r\n\tproduct.apply(product, arguments);\r\n}\r\nprod_dept.prototype = new product();\r\ncheese = new prod_dept(feta, 5, food);\r\ncar = new prod_dept(honda, 5000, auto);<\/code><\/pre><h2>Операторы === и !==<\/h2>\n<p>Операторы <tt>===<\/tt> и <tt>!==<\/tt> проверяют на соответствие (и не соответствие) операнды одинаковых типов (т. е. например оба операнда должны быть типа <tt>String<\/tt>). При сравнении с помощью этих операторов не происходит преобразования типов. Их использование необходимо, когда нужно убедиться, что оба операнда имеют одинаковый тип и одинаковые (или разные) значения.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">10 === &#039;10&#039;<\/code><\/pre><p>вернет <tt>false<\/tt>, тогда как<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">10 == &#039;10&#039;<\/code><\/pre><p>вернет <tt>true<\/tt>.<\/p>\n<h2>Изменения в операторах == и !=<\/h2>\n<p>Если операнды разного типа, происходит преобразование. Как результат возвращается значение типа <tt>Boolean<\/tt>. Если типы операндов одинаковы, то операторы <tt>==<\/tt> и <tt>!=<\/tt> эквивалентны <tt>===<\/tt> и <tt>!==<\/tt>. Значения <tt>null<\/tt> и <tt>undefined<\/tt> считаются одинаковыми, <tt>NaN<\/tt> считается не равным ни одному значению, включая <tt>NaN<\/tt>.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">10==&#039;10&#039;<\/code><\/pre><p>возвращает <tt>true<\/tt>.<\/p>\n<h2>Изменения в объекте Array<\/h2>\n<h3>Свойство length<\/h3>\n<p>Длина массива (свойство <tt>length<\/tt>) теперь задается беззнаковым 32-битным целым. Значение свойства <tt>length<\/tt> может лежать в пределах от 0 до 2<sup>32-1<\/sup>.<\/p>\n<h3>Конструктор<\/h3>\n<p>В <i>JavaScript 1.3<\/i> при использовании конструктора с единичным параметром (<tt>new Array(len)<\/tt>) конструктор проверяет тип параметра. Если это число конструктор конвертирует его в 32-битное беззнаковое целое и создает массив со свойством <tt>length(размер массива)<\/tt>, установленное в <tt>integer<\/tt>. Начальные значения элементов массива — <tt>undefined<\/tt>.<\/p>\n<h3>Метод push<\/h3>\n<p>В <i>JavaScript 1.2<\/i> метод <tt>push<\/tt> возвращал последний элемент, добавленный к массиву. В версии 1.3 метод возвращает новую длину массива.<\/p>\n<h3>Метод splice<\/h3>\n<p>В <i>JavaScript 1.2<\/i> метод <tt>splice<\/tt> возвращал удаленный элемент, если удалялся только один элемент (параметр <tt>howMany<\/tt> равен 1). В <i>JavaScript 1.3<\/i> <tt>splice<\/tt> всегда возвращает массив, содержащий удаленные элементы. Если удаляется только один элемент, то <tt>splice<\/tt> вернет массив, содержащий один единственный элемент.<\/p>\n<h2>Метод replace объекта String<\/h2>\n<h4>Синтаксис<\/h4>\n<p><tt>replace(regexp, newSubStr)<\/tt><br \/>\n<tt>replace(regexp, function)<\/tt><\/p>\n<p>В <i>JavaScript 1.3<\/i> в качестве второго параметра можно использовать функцию. В этом случае заданная функция будет вызвана после метода <tt>match<\/tt> и ее результат (строка) заменит найденную подстроку. Есть возможность передать найденную подстроку функции. Первый параметр функции содержит найденную подстроку, остальные — подсовпадения в найденной строке. Надеюсь следующий пример разъяснит смысл вышесказанного:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">&quot;XXzzzz&quot;.replace(\/(X*)(z*)\/, function (str, p1, p2) {return str +&quot; - &quot; + p1 +&quot; , &quot; + p2;} )<\/code><\/pre><p>вернет <tt>XX.zzzz — XX , zzzz<\/tt><\/p>\n<h2>Объект Boolean<\/h2>\n<p>В <i>JavaScript 1.2<\/i> значение <tt>false<\/tt> объекта <tt>Boolean<\/tt> трактовалось как ложь в логических выражениях. Если <tt>Boolean<\/tt> использовался в операторе <tt>if<\/tt> (<tt>if (выражение)<\/tt>), <i>JavaScript 1.2<\/i> использовал значение объекта <tt>Boolean<\/tt>. В <i>JavaScript 1.3<\/i> все объекты в логических выражениях трактуются, как истина, включая объект <tt>Boolean<\/tt>, даже если он имеет значение <tt>false<\/tt>.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">x = new Boolean(false);\r\nif(x) \/\/ значение этого выражения - истина\r\n{\r\n\t\/\/ Выполнение кода\r\n}<\/code><\/pre><h3>toString<\/h3>\n<p>В <i>JavaScript 1.3<\/i> метод <tt>toString<\/tt> объекта <tt>Object<\/tt> возвращает <tt>[object type]<\/tt>, где <tt>type<\/tt> — имя объекта или имя конструктора объекта. Метод <tt>toString<\/tt> объекта <tt>Array<\/tt> вернет строку, содержащую значения всех элементов, разделенных запятыми.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">var SeaLion=new Image();\r\nalert(SeaLion.toString());\t\/\/ выдаст [object Image]<\/code><\/pre><h3>eval<\/h3>\n<p>Функцию <tt>eval<\/tt> можно вызывать не напрямую. Для примера можно использовать следующий код:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">var x = 2;var y = 4;\r\nvar myEval = eval;\r\nmyEval(x + y);\r\neval(x + y);<\/code><\/pre><h3>Использование операции присваивания в логических выражениях<\/h3>\n<p>Ранние версии <i>JavaScript<\/i> конвертировали операции присваивания в логических выражениях в операции сравнения, другими словами <tt>if (x=y)<\/tt> превращалось в <tt>if (x==y)<\/tt>. В <i>Navigator 4.06<\/i> и выше возможно использование присваивания, если воспользоваться следующей конструкцией: <tt>if ( (x=y) )<\/tt>.<\/p>\n<p><i>Web<\/i>-программист казанского центра интернет Степанищев Евгений<\/p>\n",
            "date_published": "1999-04-28T02:00:00+05:00",
            "date_modified": "2023-05-16T17:37:15+05:00",
            "tags": [
                "citforum",
                "javascript",
                "netscape",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 28 Apr 1999 02:00:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119180",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}