В этой главе рассматриваются значения, распознаваемые в JavaScript, и даётся описание фундаментальных строительных блоков выражений JavaScript: значений, переменных и литералов.
В главе имеются следующие разделы:
Значения
Переменные
Константы
Литералы
Unicode
1. Значения
JavaScript распознаёт значения следующих типов:
Числа, такие как 42 или 3.14159
Логические (Булевы) значения: true или false.
Строки, такие как Howdy!.
null, специальное ключевое слово, обозначающее нулевое значение; null является также примитивным значением. Поскольку JavaScript чувствителен к регистру символов, null это не то же самое, что Null, NULL или какой-нибудь иной вариант.
undefined, свойство верхнего уровня, значение которого не определено/undefined; undefined является также примитивным значением.
Этот сравнительно небольшой набор значений типов, или типов данных, даёт возможность выполнения функций в приложении. Видимого различия между целыми и реальными числами нет. Нет в JavaScript также типа данных date. Однако Вы можете использовать объект Date и его методы для работы с датами.
Объекты и функции также являются фундаментальными элементами языка. Вы можете представлять объекты как именованные контейнеры для значений, а функции – как процедуры, выполняемые Вашим приложением.
1.1. Конверсия типов данных
JavaScript это динамически типизированный язык. Это означает, что Вы не должны специфицировать тип данных переменной при её объявлении и что типы данных при необходимости автоматически конвертируются в процессе выполнения скрипта. Так, например, Вы можете определить переменную:
var answer = 42
и позднее можете присвоить этой же переменной строковое значение:
answer = "Thanks for all the fish..."
Поскольку JavaScript типизируется динамически, такое присвоение не является ошибкой.
В выражениях, содержащих числа и строки и операцию +, JavaScript конвертирует числа в строки. Например:
x = "The answer is " + 42 // возвращает "The answer is 42"
y = 42 + " is the answer" // возвращает "42 is the answer"
В выражениях с использованием других операций, JavaScript не конвертирует числа в строки. Например:
Вы используете переменные в качестве символических имён значений. Имена переменных, называемые идентификаторы, подчиняются определённым правилам.
Идентификатор в JavaScript обязан начинаться с латинской буквы, символа подчёркивания/underscore (_) или знака доллара ($); последующие символы имени могут также быть цифрами (0–9). Поскольку JavaScript различает регистр символов, могут использоваться буквы от A до Z (верхний регистр) и от a до z (нижний регистр).
Начиная с JavaScript 1.5, Вы можете использовать в качестве идентификаторов буквы ISO 8859–1 или Unicode, такие как å и ü. Вы можете также использовать в качестве символов в идентификаторах escape-последовательности \uXXXX Unicode.
Вот примеры правильных имён: Number_hits, temp99, _name.
2.1. Объявление переменных
Можно объявить переменную двумя способами:
Просто присвоив ей значение. Например, x = 42
С помощью ключевого слова var. Например, var x = 42
2.2. Вычисление переменных
Переменная или элемент массива, которым не присвоены значения, имеют значение undefined. Результат вычисления переменной с неприсвоенным значением зависит от того, как она была объявлена:
Если такая переменная была объявлена без использования var, возникает ошибка времени выполнения.
Если такая переменная была объявлена с использованием var, результатом будет значение undefined, или ##NaN## в числовом контексте.
Следующий код демонстрирует вычисление переменных, не имеющих присвоенного значения.
function f1() {
return y - 2;
}
f1() //Вызывает ошибку времени выполнения/runtime error
function f2() {
return var y - 2;
}
f2() //возвращает NaN
Вы можете использовать undefined для определения, имеет ли переменная значение. В следующем коде переменная input не имеет присвоенного значения, и оператор if вычисляется в true.
Значение undefined ведёт себя как false, если используется с булевым значением. Например, следующий код выполняет функцию myFunction, поскольку элемент массива не определён:
myArray=new Array()
if (!myArray[0])
myFunction()
Если Вы вычисляете null-переменную, значение null ведёт себя как 0 в числовом контексте и как false – в булевом. Например:
var n = null
n * 32 //возвращает 0
2.3. Область видимости/Scope переменной
Если Вы устанавливаете идентификатор переменной путём присваивания значения вне функции, такая переменная называется глобальной, поскольку доступна в любом месте текущего документа. Если Вы объявляете переменную внутри функции, она называется локальной, поскольку «видна»/доступна только внутри этой функции.
Использование var для объявления глобальной переменной находится на Вашем усмотрении. Однако Вы обязаны использовать var для объявления переменной внутри функции.
Вы можете обращаться к переменным, объявленным в одном окне или фрэйме, из другого окна или фрэйма, специфицируя имя окна или фрэйма. Например, если переменная phoneNumber объявлена во FRAMESET-документе, Вы можете обратиться к ней из дочернего фрэйма: parent.phoneNumber.
3. Константы
Вы можете создавать именованные константы «только-для-чтения» с помощью ключевого слова const. Синтаксис идентификатора константы такой же, что и у идентификатора переменной: он обязан начинаться с буквы или символа подчёркивания и может содержать символы алфавита, числа и символ подчёркивания.
const prefix = '212';
Константа не может изменить значение путём нового присвоения и не может быть переобъявлена в процессе выполнения скрипта.
Правила видимости для констант те же, что и для переменных, за исключением того, что ключевое слово const необходимо всегда, даже для глобальных констант. Если ключевое слово отсутствует, идентификатор представляет var.
Вы не можете объявить константу с тем же именем, что и у функции или переменной, в одной области видимости с этой функцией или переменной. Например:
//ЭТО ВЫЗОВЕТ ОШИБКУ
function f{};
const f = 5;
//ЭТО ТАКЖЕ ВЫЗОВЕТ ОШИБКУ
function f{
const g=5;
var g;
//операторы
}
4. Литералы
Для представления значения в JavaScript можно использовать литералы. Они являются фиксированными значениями, не переменными, которые Вы литерально\буквально предоставляете в Вашем скрипте.
В этом разделе описаны следующие типы литералов:
Литералы Массива
Булевы
С Плавающей Точкой
Целочисленные
Литералы Объектов
Строковые Литералы
4.1. Литералы массива
Литерал массива это заключённый в квадратные скобки ([]) список из нуль или более выражений, каждое из которых представляет элемент массива. Если Вы создаёте массив с использованием литерала массива, этот массив инициализируется специфицированными значениями в качестве элементов, и его размер равен количеству специфицированных аргументов.
В следующем примере создаётся массив coffees из трёх элементов размером «три»:
coffees = ["French Roast", "Columbian", "Kona"]
Примечание
Литерал массива это тип инициализатора объекта. См. «Использование Инициализаторов Объектов».
Если массив в скрипте верхнего уровня создаётся с использованием литерала, JavaScript интерпретирует этот массив всякий раз, когда вычисляется выражение, содержащее литерал массива. Кроме того, литерал, используемый в функции, создаётся при каждом вызове функции.
Литералы массива являются также Array-объектами. См. в разделе «Объект Array» детали об Array-объектах.
Дополнительные запятые в литералах массивов
Вам не нужно специфицировать все элементы в литерале массива. Если Вы поместите две запятые в литерал, массив будет создан с пространством для unspecified(неспецифицированных)-элементов.
В следующем примере создаётся массив fish:
fish = ["Lion", , "Angel"]
В этом массиве имеются два элемента со значениями и один пустой элемент (fish[0] это Lion, fish[1] – undefined и fish[2] – Angel).
Если Вы вставите запятую в конце списка элементов, она игнорируется. В следующем примере размер массива – «три». Элемента myList[3] нет. Две другие запятые в списке обозначают новый элемент.
myList = ['home', , 'school', ];
В следующем примере размер массива – «четыре», а myList[0] и myList[2] пропущены.
myList = [ , 'home', , 'school'];
В следующем примере размер массива – «четыре», а myList[1] и myList[3] пропущены. Игнорируется только последняя запятая. Эта ведомая запятая не обязательна.
myList = ['home', , 'school', , ];
4.2. Булевы литералы
Тип Boolean имеет два литеральных значения: true и false.
Не путайте примитивные Boolean-значения true и false со значениями true и false объекта Boolean. Объект Boolean является «обёрткой»-оболочкой примитивного типа данных Boolean. См. «Объект Boolean».
4.3. Литералы с плавающей точкой
Литерал с плавающей точкой может состоять из следующих частей:
10-ричного целого числа
Десятичной точки (".")
Дробной части (другого 10-ричного числа)
Экспоненты
Экспонентная часть это e или E и последующее целое число, которое может иметь знак ("+" или -"). Литерал с плавающей точкой обязан иметь как минимум одну цифру и десятичную точку или e (или E).
Примеры литералов с плавающей точкой: 3.1415, -3.1E12, .1e12, 2E-12.
4.4. Целочисленные литералы
Целые числа могут иметь десятеричную базу (база 10), 16-ричную (база 16) и 8-ричную (база 8). Десятеричный целочисленный литерал состоит из последовательности цифр без ведущего 0 (нуля). Ведущий 0 (нуль) в целочисленном литерале означает, что это 8-ричный литерал; ведущие символы 0x (или 0X) означают 16-ричный. 16-ричные целые числа могут состоять из цифр (0 – 9) и букв a-f и A-F. 8-ричные целые могут состоять только из цифр 0 – 7.
8-ричные целочисленные литералы использовать не рекомендуется, и они будут удалены из стандарта ECMA-262, Edition 3. JavaScript 1.5 ещё поддерживает их для обеспечения обратной совместимости.
Примеры целочисленных литералов: 42, 0xFFF, -345.
4.5. Литералы объектов
Литерал объекта это заключённый в фигурные скобки ({}) список из 0 или более пар свойств объекта и ассоциированных с ними значений. Вы не должны использовать литерал объекта в начале оператора. Это приведёт к ошибке, или поведение будет не таким, какое Вы ожидаете, поскольку { будет интерпретироваться как начало блока.
Вот пример литерала объекта. Первый элемент объекта car определяет свойство myCar; второй элемент – свойство getCar, вызывающее функцию (CarTypes("Honda")); третий элемент, специальное свойство, использует существующие переменные (Sales).
var Sales = "Toyota";
function CarTypes(name) {
if(name == "Honda")
return name;
else
return "Sorry, we don't sell " + name + ".";
}
car = {myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales}
document.write(car.myCar); // Saturn
document.write(car.getCar); // Honda
document.write(car.special); // Toyota
Вы можете использовать числовой или строковой литерал для именования свойства или вложения одного объекта в другой. Следующий пример использует эти опции:
Строковой литерал это 0 или более символов, заключённых в двойные (") или одинарные (') кавычки. Строка обязана быть ограничена кавычками одного вида; то есть, оба знака – двойные, или оба знака – одинарные кавычки.
Примеры строковых литералов:
blah
'blah'
1234
«одна строка \n вторая строка»
Вы можете вызывать любой метод объекта String в строковом литеральном значении – JavaScript автоматически конвертирует строковой литерал во временный String-объект, вызывает метод, затем уничтожает временный String-объект. Вы можете также использовать свойство String.length? в строковом литерале.
Вы, как правило, должны использовать строковой литерал, если только Вам не нужно использовать именно String-объект. См. в разделе «Объект String» детальную информацию о String-объектах.
Использование специальных символов в строках
Кроме обычных символов, Вы можете включать в строки также и специальные символы, как в это примере:
«одна строка \n вторая строка»
В следующей таблице дан список специальных символов, которые Вы можете использовать в строках JavaScript.
Символ в кодировке Latin -1, специфицированный тремя 8-ричными цифрами XXX в диапазоне от 0 до 377. Например, \251 это 8-ричная последовательность для символа copyright.
\xXX
Символ в кодировке Latin -1, специфицированный двумя 16-ричными цифрами XX от 00 до FF. Например, \xA9 это 16-ричная последовательность для символа copyright.
\uXXXX
Символ Unicode, специфицированный четырьмя 16-ричными цифрами XXXX. Например, \u00A9 это Unicode-последовательность для символа copyright. См. Escape-Последовательности Unicode.
Заменяющие (Escaping) символы
Для символов, не указанных в Таблице 2.1, предшествующий backslash игнорируется, но такое использование не рекомендуется и должно быть исключено.
Вы можете вставить знак кавычки в строку, предварив его символом backslash. Это известно как escaping (замена) знака кавычки. Например,
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service."
document.write(quote)
В результате будет выведено
He read «The Cremation of Sam McGee" by R.W. Service.
Чтобы включить в строку символ backslash, Вы обязаны escape'ировать (подменить) символ backslash. Например, чтобы ввести в строке путь c:\temp, используйте:
var home = "c:\\temp"
5. Unicode
Unicode это стандарт универсального кодирования для отображения основных языков и видов письма. Он покрывает языки Америки, Европы, Среднего Востока, Африки, Индии, Азии и Океании, а также исторические виды письма и технические символы. Unicode позволяет передавать, обрабатывать и отображать многоязычные тексты, а также использовать общепринятые технические и математические символы. Предполагается, что этот стандарт должен разрешить проблемы интернационализации в многоязычной компьютерной среде, такие как различия в национальных стандартах кодировки символов. В настоящее время, однако, поддерживаются не все современные и архаичные виды письма.
Набор символов Unicode может использоваться для всех известных кодировок. Unicode смоделирован после ASCII-набора символов (American Standard Code for Information Interchange). Он использует числовое значение и имя для каждого символа. Кодировка символов специфицирует идентификатор символа и его числовое значение (кодовую позицию), а также битовое представление этого значения. 16-битное числовое значение (кодовое значение) определяется 16-ричным числом и префиксом U, например, U+0041 представляет символ A. Уникальное имя этого символа – LATIN CAPITAL LETTER A.
Версии JavaScript до 1.3.
Unicode не поддерживается в версиях, более ранних, чем JavaScript 1.3.
5.1. Совместимость Unicode с ASCII и ISO
Unicode совместим с символами ASCII и поддерживается многими программами. Первые 128 символов Unicode соответствуют набору ASCII и имеют те же битовые значения. Символы Unicode с U+0020 до U+007E эквивалентны ASCII-символам с 0x20 по 0x7E. В отличие от ASCII, который поддерживает латинский алфавит и использует набор 7-битных символов, Unicode использует 16-битное значение для каждого символа. Это даёт возможность отобразить десятки тысяч символов. Поддерживается также механизм расширения, UTF-16, который позволяет кодировать более миллиона символов путём использования пар 16-битных символов. UTF переводит кодировку в реальные биты.
Unicode полностью совместим с Международным Стандартом ISO/IEC 10646–1; 1993, который является поднабором ISO 10646, а также поддерживает ISO UCS-2 (Universal Character Set), который использует двухбайтные значения (два байта, или 16 битов).
JavaScript и Navigator поддерживают Unicode, Это означает, что Вы можете использовать не-Latin, международные и локализованные символы, плюс специальные технические символы в программах на JavaScript. Unicode предоставляет возможность стандартного кодирования многоязыковых текстов. Поскольку Unicode совместим с ASCII, программы могут использовать символы ASCII. Вы можете использовать не-ASCII Unicode-символы в комментариях, строковых литералах, идентификаторах и регулярных выражениях JavaScript.
5.2. Escape-последовательности Unicode
Вы можете использовать заменяющие последовательности Unicode в строковых литералах, регулярных выражениях и идентификаторах. Заменяющая (escape) последовательность состоит из шести символов ASCII: \u и 16-ричного числа из четырёх цифр. Например, \u00A9 представляет символ copyright. Каждая escape-последовательность Unicode интерпретируется в JavaScript как одиночный символ.
Следующий код возвращает символ copyright и строку Netscape Communications:
x="\u00A9 Netscape Communications"
В таблице приведён список часто используемых специальных символов и их значения Unicode.
Таблица 2.2 Unicode-значения специальных символов
Категория
Значение Unicode
Имя
Форматное имя
Пробельные символы
\u0009
Табуляция
<TAB>
\u000B
Вертикальная табуляция
<VT>
\u000C
Прогон страницы
<FF>
\u0020
Пробел
<SP>
Значения конца строки
\u000A
Прогон строки
<LF>
\u000D
Возврат каретки
<CR>
Дополнительные последовательности Unicode
\u0008
Backspace
<BS>
\u0009
Горизонтальная табуляция
<HT>
\u0022
Двойная кавычка
»
\u0027
Одинарная кавычка
'
\u005C
Backslash
\
Использование escape-последовательнотей Unicode в JavaScript отличается от Java. В JavaScript escape-последовательность сразу никогда не интерпретируется как спецсимвол. Например, последовательность терминатора строки внутри строки не оканчивает строку до того, как она будет интерпретирована функцией. JavaScript игнорирует любую escape-последовательность, если она находится в комментарии. В Java, если escape-последовательность используется в однострочном комментарии, она интерпретируется как символ Unicode. В строковом литерале компилятор Java сначала интерпретирует escape-последовательности. Например, если последовательность «терминатор строки» (\u000A) используется в Java, она оканчивает строковой литерал. В Java это приводит к ошибке, поскольку терминаторы строки не допускаются в строковых литералах. Вы обязаны использовать \n в строковом литерале в качестве символа новой строки. В JavaScript escape-последовательность работает так же, как \n.
5.3. Отображение символов Unicode
Вы можете использовать Unicode для отображения символов на разных языках или технических символов. Чтобы правильно отображать символы, клиент, такой как Netscape Navigator 4.x или Netscape 6, должен поддерживать Unicode. Кроме того, нужный Unicode-шрифт обязан быть доступен клиенту, а клиентская платформа (ОС) обязана поддерживать Unicode. Часто шрифты Unicode не отображают всех символов Unicode. Некоторые платформы, такие как Windows 95, предоставляют частичную поддержку Unicode.
Чтобы принять ввод не-ASCII символов, необходимо пересылать ввод клиенту как Unicode. Используя стандартную расширенную клавиатуру, клиент не может легко ввести дополнительные символы, поддерживаемые Unicode. Иногда единственным способом ввести символы Unicode будет использование escape-последовательностей Unicode.
Дополнительную информацию о Unicode см. на вэб-сайте Консорциума Unicode и в книге The Unicode Standard, Version 2.0, опубликованной издательством Addison-Wesley в 1996 году.