Глаза страшат, а руки делают

ЧАСТЬ ВТОРАЯ


29. Типы данных и функции ядра

  • типы данных;
  • глобальный объект;
  • свойства глобального объекта;
  • классификация методов глобального объекта;
  • конвертирующие методы;
  • методы перекодировки данных;
  • проверяющие методы;
  • ссылающийся метод eval();
  • отладочные методы.

Типы данных

Тип данных — это своего рода «база данных», набор определённых значений, доступных для манипулирования ими.

Обычно знакомство с типами данных происходит на начальном этапе обучения языку программирования. В случае с JavaScript я сознательно оттягивал этот момент. Как мы уже говорили, JavaScript — это динамически типизированный язык. То есть мы не обязаны явно определять тип данных переменной при её объявлении, а сами типы при необходимости автоматически конвертируются друг в друга при выполнении скрипта.

У такой динамичности есть и другое следствие: нечёткость в классификации типов. Так, здесь нет обычных для других языков типов данных Array или Date, а объекты Array() и Date() манипулируют разными типами. А вот типы данных Number, Boolean или String наряду с объектами Number(), Boolean() и String() здесь имеются. Кроме того, есть здесь и такие типы, которые в других языках отсутствуют именно как типы.

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

Их шесть: Undefined (неопределенный), Null (нулевой), Boolean (логический), String (строковый), Number (числовой) и Object (объектный).

Обратите внимание

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

Undefined

Состоит из единственного значения undefinedмаленькой буквы!). Его принимает переменная, которая уже объявлена в программе, но значение ей ещё не присвоено. Кроме того, в некорректно написанных выражениях и функциях это значение может возникнуть вместо ожидаемого. Подробнее см. ниже в описании свойства undefined глобального объекта.


Null

Состоит из единственного значения null (опять же с маленькой буквы). Оно означает нулевую, пустую или несуществующую ссылку. Различие между undefined и null практически отсутствует, хотя теоретически undefined означает, что переменной не присвоено никакого значения, a null — что ей присвоено пустое значение. Однако в конструкции var x = "" x уже не является null.


Boolean

Состоит из двух логических значений: true (истина, да) и false (ложь, нет). Удобен для создания «переключателей»:

function daNet(a) {
    if(a == true)
        {[инструкция 1]}
    else
        {[инструкция 2]}
}

// вызов функции:
daNet(false)

String

Состоит из текстовых строк.

Что такое строка? Это упорядоченный массив из нуля или более элементов строки — символов Unicode (т.е. 16-битовых целых чисел без знака). Элементы строки нумеруются, начиная с нуля. Длина строки — количество её элементов; пустая строка состоит из нуля элементов (нуль — это уже «что-то» и потому не null). Когда принимается этот тип данных, массив преобразовывается в набор символов.


Number

Содержит 18437736874454810627 значений, соответствующих 64-битовому формату плавающих чисел двойной точности IEEE 754, два значения бесконечности (положительная и отрицательная) и значение NaN (Не-Число). Любопытно, что в этом типе различаются положительный нуль (+0 или 0) и отрицательный нуль (-0).


Object

Значением этого типа являются объекты. В отличие от других типов, объект — это неупорядоченный набор свойств, позволяющий программисту «наводить порядок» с помощью программного кода.

Глобальный объект

В наших уроках уже встречалось упоминание о загадочном объекте-невидимке Global, тайном анонимном правителе империи JavaScript. Он создаётся выполняющей системой JavaScript перед началом выполнения любого скрипта. Это единственный безымянный объект, и доступ к его свойствам и методам осуществляется без имени объекта. Поэтому их обычно называют функциями ядра или свойствами и методами верхнего уровня.

Свойства глобального объекта

Их всего три, и с двумя из них мы уже знакомы как со свойствами объекта Number. Начиная с версии JavaScript 1.3 они стали и свойствами верхнего уровня.

Infinity

Вспомним два свойства объекта Number: POSITIVE_INFINITY и NEGATIVE_INFINITY.

В JavaScript 1.3 свойство Infinity определено и для объекта Global (именно в такой орфографии: маленькими буквами, начиная с заглавной) как положительная бесконечность. Любое число, умноженное на Infinity, всегда Infinity, а любое число, делённое на Infinity, всегда 0.

NaN

Означает Not-a-Number, то есть Не-Число. Мы уже встречались с этим как со свойством объекта Number, но с версии JavaScript 1.3 значение определено и для объекта Global.

undefined

Формально с этим свойством мы ещё не знакомились, но наверняка вы с ним уже встречались в самые неподходящие моменты; возможно, оно стало для вас чем-то вроде компьютерного «мата».

Означает это свойство — «Значение отсутствует». Если переменной ничего не было присвоено, она принимает значение undefined. Его можно использовать для проверки того, было ли присвоено переменной значение. Методы и выражения JavaScript иногда сами возвращают значение undefined, если у используемых переменные нет своих значений (вот тогда и взвоешь волком, когда вместо ожидаемого результата твоей функции тебя матерят undefined).

Маленький практический пример

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

Допустим, у нас есть несколько пунктов, часть которых ещё не обеспечены страницами. В массиве пунктов определим всё, что запланировано. В массив ссылок зальём то, что есть.

var x = new Array; //пункты меню
x[0] = "Урок 1";
x[1] = "Урок 2";
x[2] = "Урок 3";
x[3] = "Урок 4";
x[4] = "Урок 5";
x[5] = "Урок 6";
x[6] = "Урок 7";
x[7] = "Урок 8";
var y = new Array; //адреса ссылок
y[0] = "lsn_js1.html";
y[1] = "lsn_js2.html";
y[2] = "lsn_js3.html";
y[3] = "lsn_js4.html";
y[5] = "lsn_js6.html";

Функция вывода

Вариант первый, грязный.

То есть мы просто выводим полное меню «на вырост», не заботясь, правильная ссылка или битая (не люблю такие ресурсы):

function setFullMenu() {
var i;
document.write("<ul>");
    for (i=0; i<x.length; i++)
    document.write("<li><a href='" + y[i] + "'>" + x[i] + "</a></li>");
document.write("</ul>");
}

Результат:

Вариант второй, неполный вывод.

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

function setRealMenu() {
var i;
document.write("<ul>");
    for (i=0; i<x.length; i++)
    {
        if (y[i] != undefined)
        document.write("<li><a href='" + y[i] + "'>" + x[i] + "</a></li>");
    }
document.write("</ul>");
}

Условие if (y[i] != undefined) выводит из круга неопределённые адреса. В меню мы увидим только работающие ссылки:

Вариант третий, полное меню с нефункциональными ссылками.

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

function setVirtualMenu() {
var i;
document.write("<ul>");
    for (i=0; i<x.length; i++)
    {
        if (y[i] == undefined)
            document.write("<li>" + x[i] + "</li>");
        else
            document.write("<li><a href='" + y[i] + "'>" + x[i] + "</a></li>");
    }
document.write("</ul>");
}

Результат:

Вариант четвёртый, полное меню с уведомлениями.

Этот вариант мне представляется самым вежливым и интеллигентным.

function setAdvancedMenu() {
var i;
document.write("<ul>");
    for (i=0; i<x.length; i++)
    {
        if (y[i] == undefined)
            y[i] = "javascript: alert(\"Извините, материал еще не готов.\");";
    document.write("<li><a href='" + y[i] + "'>" + x[i] + "</a></li>");
    }
document.write("</ul>");
}

Результат:

Методы глобального объекта (собственно функции ядра)

В руководствах и справочниках они также упоминаются как функции ядра или встроенные функции. Этих методов достаточно много, и я попытался разбить их на условные категории

Конвертирующие методы

Преобразуют типы данных объекта или числовые типы.

Boolean()
Number()
Object()
String()
parseInt()
parseFloat()

Методы перекодировки данных

Основная группа этих методов кодирует и раскодирует строковые данные. Методы, взятые в квадратные скобки, работают с серверным JavaScript, разрушая и восстанавливая не подлежащие открытой передаче данные. Считаются устаревшими, как и весь серверный JavaScript, уступивший дорогу более совершенным серверным языкам.

encodeURI(), decodeURI()
encodeURIComponent(), decodeURIComponent()
escape(), unescape()
[taint(), untaint()]

Проверяющие методы

Возвращают булев результат проверки: да/нет.

isFinite()
isNaN()

Ссылающийся метод

Возвращает определённые данные об объекте.

eval()

Отладочные методы (работают не во всех браузерах)

Подозреваю, что эти методы нам не пригодятся.

ScriptEngine()
ScriptEngineBuildVersion()
ScriptEngineMajorVersion()
ScriptEngineMinorVersion()
watch()
unwatch()

Конвертирующие методы

Boolean()

Преобразует любой объект в логическое значение true или false по следующим правилам:

Исходный тип

Результат

Undefined

false

Null

false

Boolean

без изменений

Number

false, если аргумент равен +0, -0 или NaN; true в остальных случаях

String

false, если аргумент — пустая строка; true в остальных случаях

Object

true

Синтаксис

Boolean(объект)

Аргумент

объект — любой объект JavaScript


Number()

Конвертирует любой определяемый объект в число.

Синтаксис

Number(объект)

Аргумент

объект — любой объект JavaScript


Object()

Преобразует аргумент в значение объекта

Синтаксис

Object(любое значение)

String()

Конвертирует значение любого объекта в строковый тип данных по следующим правилам:

Исходный тип

Результат

Undefined

"undefined"

Null

"null"

Boolean

"true", если аргумент равен true, и "false", если аргумент равен false

Number

текстовое представление числа

String

без изменений

Object

результат преобразования значения объекта по умолчанию

Синтаксис

String(объект)

Аргумент

объект — любой объект JavaScript


Правила преобразования числа n в строку:

если n равно NaN, то результат "NaN";

если n равно +0 или -0, то результат "0";

если n отрицательно, то результат будет склейкой строки "-" и абсолютной величины n, преобразованной в строку;

если n равно бесконечности, то результат "Infinity";

в остальных случаях — строка с десятичным представлением числа n.

Примечание

В отличие от объектного метода toString(), метод String() не поддерживает аргумента для определения системы счисления.

Если аргумент является объектом Date(), метод возвращает строковое представление даты. Формат в разных браузерах немного отличается.

Для наглядности зададим дату в миллисекундах:

var fixedDate = new Date(1244318400000)
document.write(String(fixedDate))

Результат:

IE

Sun Jun 7 00:00:00 UTC+0400 2009

NS (Mozilla, Firefox)

Sun Jun 07 2009 00:00:00 GMT+0400

Opera

Sun, 07 Jun 2009 00:00:00 GMT+0400

Gecko

Sun Jun 07 2009 00:00:00 GMT+0400 (Russia Daylight Time)

Ваш браузер


parseInt()

Синтаксис

parseInt(строка[, система])

Аргументы

строка — любая строка, которая начинается с одной или более цифр.

система — целое число, представляющее собой основание системы счисления (например, 2, 10, 16).

Возвращает целочисленное значение цифр в назначенной строке в десятичном счислении. Строковое значение должно начинаться, по крайней мере, с цифры, иначе результат — NaN. Если строки начинаются с чисел, но дальше записаны символами, то только начальные литералы преобразовываются в числа. Например, попросим его «отпарсить» версию Вашего браузера:

document.write("<p>Параметр: " + navigator.appVersion + "</p>")
document.write("<p>Результат: " + parseInt(navigator.appVersion) + "</p>")

Если второй аргумент (основание системы счисления) опущен, то JavaScript интерпретирует назначенную строку следующим образом:

Если строка начинается с "0x", основание шестнадцатеричное.

Если строка начинается с "0", основание восьмеричное.

Если строка начинается с любого другого значения, основание десятичное.

Дополнительный аргумент позволяет определить систему счисления числа независимо от начального символа.

Примечание

Результат метода всегда выводится в десятичной системе. Метод возвращает тип данных Number, а все арифметические операции в JavaScript работают только с десятичеыми значениями.

Если вам нужно отобразить число в другой системе, это можно сделать только в строковом значении методом toString(система).

Если parseInt() обнаруживает символ, который не является числом для назначенного основания, он игнорирует этот и все последующие символы и возвращает целочисленное значение, разобранное до этого места. Все числа parseInt() усекает до целочисленных значений. Начальный и конечный пробелы игнорируются. Пробелы в середине распознаются как Не-Число.

Вот несколько примеров:

Заданная строка

Второй аргумент

Результат

Примечание

0x5678

пустой

конвертирует 16-ричное число

0x5678

10

значение 1 символа

024

пустой

конвертирует 8-ричное число

024

10

конвертирует 10-ичное число, отбрасывая 0

face

пустой

при 10-ичном основании это не цифры

face

16

конвертирует 16-ричное число FACE

89

8

при 8-ричном основании это не цифры

89 bags

пустой

отбрасывает буквы

89 bags

16

конвертирует 16-ричное число 89 (до пробела)

89bags

16

конвертирует 16-ричное число 89BA

52.887

пустой

усечена дробная часть (без округления)


parseFloat()

Синтаксис

parseInt(строка)

Аргумент

строка — любая строка, которая начинается с одной или более цифр.

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

Метод parseFloat() распознаёт только десятичные значения, у него нет второго аргумента.

document.write(parseFloat("235.85 км"))

Результат:

Давайте забавы ради создадим функцию, которая бы распознавала и русские запятые:

function parseFloatRu(str) {
/* Тут опять, забегая вперёд,
можно использовать регулярное выражение*/
var strRu = str.replace(/,/g, ".")
return parseFloat(strRu)
}

Проверим и сравним:

document.write(parseFloat("235,85 км"))
document.write("<br>" + parseFloatRu("235,85 км"))

Результат:

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

Методы перекодировки данных

Для понимания природы этих методов многим, вероятно, необходим маленький ликбез в вопросах системы кодирования адресов интернета.


Что такое URI

http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D1%80%D0
%B5%D0%B4%D0%B8%D1%82

Случалось вам видеть в адресной строке нечто подобное?

Это русские буквы, закодированные в URI (Uniform Resource Identifier, унифицированном идентификаторе ресурсов). Раскодирование отобразит:

http://ru.wikipedia.org/wiki/Микрокредит

А может быть

http://ru.wikipedia.org/wiki/Ìèêðîêðåäèò

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

Самые известные примеры URI — это URL и URN. URL — это URI, который, помимо идентификации ресурса, предоставляет ещё и информацию о местонахождении этого ресурса. А URN — это URI, который идентифицирует ресурс в определённом пространстве имён (и, соответственно, в определённом контексте).

Синтаксис:

схема:идентификатор

схема — схема обращения к ресурсу: например, http, ftp, mailto, urn

идентификатор — непосредственный идентификатор ресурса, вид которого зависит от выбранной схемы обращения к ресурсу

Подробнее об URI


Что такое UTF-8

Вернёмся к примерам закодированного и раскодированного URI. Сколько букв в слове «Микрокредит»?

Одиннадцать.

А сколько знаков в его коде (если за начало каждого знака принять символ «%»)?

Раз, два, три, четыре двадцать два. То есть, на каждую букву приходится по две кодовых «загогулины».

Это кодировка UTF-8. Формат преобразования Юникода (Unicode Transformation Format), совместимый с 8-битовым кодированием текста. UTF-8 применяется в функциях ядра, кодирующих URI.

Небезынтересно хотя бы немного узнать, как эта штука устроена.

Как вы, наверно, знаете, латинские буквы, цифры и «препинаки» во всех кодировках совпадают и занимают самое начало кодовой таблицы — первые 128 ячеек (от 0 до 127 или, в 16-ричном представлении, от 0x00 до 0x7F). То же и в UTF-8. На каждую букву-цифру-препинак в этом диапазоне приходится один «кряк» — от %00 до %7F.

Далее UTF-8 разбит на 64-ячеечные области, каждая из которых имеет свой префикс-серию (что-то вроде автомобильных номеров). Символы Unicode от 2048(0x800) и выше имеют в UTF-8 по два префикса (т.е. эти символы UTF-8 состоят из трёх «кряков»).

Все 64-ячеечные области начинаются от 128 (%80) и заканчиваются на 191 (%BF). Для кириллицы (включая и расширения) отведено аж 4 таких «улья» (серии 208-211 [%D0-%D3]), то есть все коды от %D0%80 по %D3%BF.

Собственно алфавитные символы укладываются в полтора «улья»:

Ё

%D0%81

А–Я

%D0%90–%D0%AF

а–п

%D0%B0–%D0%BF

р–я

%D1%80–%D1%8F

ё

%D1%91

Подробнее об UTF-8


Просветились? Теперь можно перейти и к самим методам.


encodeURI()

Синтаксис

encodeURI(uri)

Аргумент

uri — полный URI.

Кодирует URI, замещая каждый экземпляр определённого символа одной, двумя или тремя escape-последовательностями, представляющими кодировку данного символа в UTF-8. Каждая полученная escape-последовательность имеет префикс %

Не кодирует зарезервированные символы, имеющие специальное значение в URI.

Зарезервированные символы:

, / ? : @ & = + $

Незаменяемые символы:

латинские буквы
арабские цифры
- _ . ! ~ * ' ( )

Знак score:

#

decodeURI()

Синтаксис

decodeURI(encodedURI)

Аргумент

encodedURI — полный кодированный URI.

Метод, обратный encodeURI(): декодирует URI, созданный методом encodeURI() или любым другим способом.

Не декодирует escape-последовательности, которые не могут быть созданы методом encodeURI().


encodeURIComponent()

Синтаксис

encodeURIComponent(uri)

Аргумент

uri — компонент URI.

Кодирует компонент URI, замещая каждый экземпляр определённого символа одной, двумя или тремя escape-последовательностями, представляющими кодировку данного символа в UTF-8. Считает, что uri — это компонент URI, а не полный URI, поэтому не реагирует на зарезервированные символы (см. encodeURI) и кодирует их «на общих основаниях».

Замещает все символы соответствующими escape-последовательностями UTF-8, за исключением следующих символов:

Незаменяемые символы:

латинские буквы
арабские цифры
- _ . ! ~ * ' ( )

Знак score:

#

decodeURIComponent()

Синтаксис

decodeURIComponent(encodedURI)

Аргумент

encodedURI — кодированный компонент URI.

Метод, обратный encodeURIComponent(): декодирует компонент URI. Заменяет каждую escape-последовательность кодированного компонента URI символом, который эта последовательность представляет.


escape()

Синтаксис

escape(строка)

Аргумент

строка — любая строка.

Метод escape() возвращает закодированную строку. Не кодируются латинские буквы, цифры и всего шесть спецсимволов:

@ * / + - _

Остальные символы со значениями Unicode 0–255 (0x00–0xFF) замещаются кодировкой, аналогичной encodeURI() и encodeURIComponent(): %XX, где XX — эквивалент шестнадцатеричного числа, представляющего символ.

Символы со значением больше, чем 255 (т.е. начиная с трёхзначных чисел в 16-ричной системе), сохраняются в формате %uXXXX, где %u — префикс, указывающий на Unicode, а XXXX — шестнадцатеричное значение символа Unicode.

Пример:

document.write(escape("Компания «R-Style»"))

Результат:

Зелёным я подкрасил длинные символы Unicode, красным — некодируемые символы.

Метод escape() нельзя использовать для кодировки полного URI, но URL — адресную часть URI — часто кодируют именно этим методом. И входят в противоречие с популярной русской кодировкой Windows-1251, которая не использует синтаксис %uXXXX. Чуть ниже я расскажу об этих противоречиях.


unescape()

Синтаксис

unescape(строка)

Аргумент

строка — закодированная строка.

Декодирует строку, закодированную методом escape().


Проблемы с русской кодировкой

Сегодняшние версии методов кодировки цивилизованно ориентированы на Unicode. А мы продолжаем пользоваться мамонтом Windows-1251, а иногда ещё и динозавром KOI-8. Для тотального перехода на UTF-8 есть ряд объективных препятствий. Остаётся сидеть, ждать и выдумывать. Ведь не зря же говорится, что голь на выдумки хитра.

Так в чём же конкретная проблема?

Кодировки Windows, рассчитанные на совместимость со старыми программами и документами, не поддерживающими Unicode, устроены по принципу замещения расширенной латиницы региональными настройками. Именно так работают Windows-1251 и KOI-8.

Поэтому для кириллицы метод escape() вместо расширенных юникодовых «крякозубров» может использовать диапазон %B0–%1AF, который использовали для кириллицы старые шрифты до эпохи Unicode.










Если раскодирование кириллического текста отображается символами ASCII,
нажмите кнопку «Коррекция».

taint()

Синтаксис

taint([объект])

Аргумент

объект — свойство, переменная, функция или объект для разрушения. При отсутствии аргумента taint добавляется к самому скрипту.

Этот метод сгоряча затолкали в JavaScript 1.1, а уже из JavaScript 1.2 благополучно вынули.

Метод разрушает данные в элементе скрипта, указанном в аргументе, или во всём скрипте. Придуман для предотвращения передачи конфиденциальной информации, допустим, структуры директорий или истории пользовательской сессии. Чтобы JavaScript передал разрушенные значения на сервер, требуется разрешение пользователя.

Метод taint() не модифицирует аргументы, просто возвращает разрушенную копию значения или ссылку на это значение.

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

untaint()

Синтаксис

untaint([объект])

Аргумент

объект — свойство, переменная, функция или объект для восстановления. При отсутствии аргумента восстанавливается весь скрипт.

Метод, обратный taint()

Проверяющие методы

isFinite()

Синтаксис

isFinite(выражение)

Аргумент

выражение — любое выражение JavaScript.

Вычисляет аргумент, чтобы определить, является ли он конечным числом.

Возвращает true, если аргумент является любым значением, отличным от NaN, отрицательной бесконечности или положительной бесконечности, то есть является числом и находится в пределах диапазона Number.MIN_VALUE и Number.MAX_VALUE (включительно). В остальных случаях возвращается false.

Примеры

isFinite(56)                        // возвращает true
isFinite(Number.POSITIVE_INFINITY)  // возвращает false
isFinite(Number.NEGATIVE_INFINITY)  // возвращает false
isFinite("четыреста двадцать пять") // возвращает false

isNaN()

Синтаксис

isNaN(выражение)

Аргумент

выражение — любое выражение JavaScript.

Проверяет, является ли аргумент числом. Если аргумент — нечисловое выражение (NaN), возвращает true.

Примеры

isNaN("тридцать два") // возвращает true
isNaN(32)             // возвращает false

Ссылающийся метод

eval()

Синтаксис

eval(строка)

Аргумент

строка — любая строка, представляющая выражение JavaScript, утверждение или последовательность утверждений. Выражение может включать переменные и свойства существующих объектов.

Метод eval возвращает ссылку на объект, записанный в аргументе как строка.

Если строка представляет собой выражение, eval вычисляет это выражение. Если аргументом является один или более операторов JavaScript, eval выполняет эти операторы. Если аргумент eval — не оператор, не выражение и вообще не строка, метод не «впадает в глюки», а просто возвращает аргумент без изменений.

В первом из следующих примеров специфицируется конструктор String, и eval вместо вычисления строки возвращает объект String. Во втором примере происходит обычное вычисление.

eval(new String("2+2")) // возвращает объект String, содержащий "2+2"
eval("2+2")             // возвращает 4

Вообще-то не следует использовать eval для вычисления арифметических выражений. Не потому, что это «глючно», а просто незачем.

Не следует также использовать неявные вызовы метода eval по имени, отличному от eval — как, например, в следующем коде:

var x = 2
var y = 4
var myEval = eval
myEval("x + y")

Не путайте этот способ со вполне «легитимным» назначением результата eval на переменную:

var x = 2
var y = 4
var myEval = eval("x + y")

Следующий пример использует eval, чтобы вычислить строку str. Эта строка состоит из утверждений JavaScript, которые при x = 5 открывают окно и присваивают z значение 42, а в противном случае — если x — число, то z = 0, а если не число, то z принимает значение x. Когда в текстовое поле вводится значение, то утверждения выполняются, и в результате вычислений возвращается значение z, которое выводится в строке под формой.

Примечание

Чтобы пример сработал, после ввода в форму нужно щёлкнуть по любому месту в окне (чтобы снять фокус с текстового поля).

<form>
<input type=
"text" id="xx" onChange="showZ();">
</form>

<p id="res">Значение z не определено</p>
<script type="text/javascript">
function showZ() {
var
x = document.getElementById("xx").value
var str = "if (x == 5) {alert('z = 42'); z = 42;} else {if (isNaN(x)== true) {z = '\"' + x + '\"'} else {z = 0}}; "
document.getElementById("res").innerHTML = "Значение z - " + eval(str)
}
</script>

Отладочные методы

ScriptEngine()

ScriptEngineBuildVersion()

ScriptEngineMajorVersion()

ScriptEngineMinorVersion()

Аргументов не имеют

Эти методы работают только в IE и показывают информацию о механизме выполнения сценария JScript, VBScript или VBA, который в настоящее время в запущен (выполняет инструкции, вызывает функции), и о том, какая версия этого механизма установлена. Для JScript ScriptEngineBuildVersion() обращается к верси файла JScript.dll, установленного среди файлов браузера. Мajor version — часть номера версии налево от десятичной точки версии; minor version — часть направо от десятичной точки.

ScriptEngine() возвращает строку — одно из следующих имен: JScript, VBA или VBScript. Остальные методы возвращают целочисленные значения.

watch()

unwatch()

Синтаксис

watch(свойство, функция)
unwatch(свойство, функция)

Аргументы

свойство — свойство объекта, за которым нужно наблюдать.

функция — имя функции (без скобок), вызываемой при каждом изменении значений наблюдаемого свойства.

Эти методы, наоборот, работают только в браузерах семейства NN. Они используются прежде всего отладчиками JavaScript. Когда инструкция вызывает для объекта метод watch(), аргументы включают свойство, значение которго должно наблюдаться и ссылку на функцию, которая будет вызвана при каждом изменении значения свойства оператором присваивания. Для отключения операции watch используется метод unwatch().

Никаких значений не возвращают.


Итак, мы узнали:

кое-что о свойствах и методах глобального объекта и немного о кодировке UTF-8.

А также сделали:

Простенький URI-кодировщик с поправкой на кириллицу.


К следующему уроку >>


 005397