Клиентский JavaScript. Руководство по Использованию
Глава 2
Значения, Переменные и Литералы
В этой главе рассматриваются значения, распознаваемые JavaScript, и строительные блоки выражений JavaScript: переменные и литералы.
В главе имеются следующие разделы:
Значения
JavaScript распознает следующие типы значений:
- Числа, такие как 42 или 3.14159
-
Логические (Булевы) значения, это
true
илиfalse
- Строки, такие как "Howdy!"
-
null
, специальное ключевое слово, обозначающее значение null;null
является также примитивным значением. Поскольку JavaScript учитывает регистр символов,null
это не то же самое, чтоNull
,NULL
или иной вариант. -
undefined
, свойство верхнего уровня/top-level, значением которого является undefined;undefined
также является примитивным значением.
Этот сравнительно небольшой набор типов значений, или типов данных, дает
Вашим приложениям возможность выполнять различные функции. Отсутствует явное
различие между целыми и реальными числами. Нет также типа данных date. Однако Вы
может использовать объект Date
и его методы для работы с датами.
Объекты и функции также являются основными элементами языка. Можно считать объекты именованными контейнерами значений, а функции - процедурами, которые Ваше приложение выполняет.
Конвертация типов данных
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 не конвертирует числа в строки. Например:
"37" - 7 // возвращает 30
"37" + 7 // возвращает 377
Переменные
Вы используете переменные как символические имена для значений. Вы даете переменной имя, по которому Вы ссылаетесь на нее и которое обязано соответствовать определенным требованиям.
Идентификатор в JavaScript, или name\имя, обязан начинаться с буквы или символа подчеркивания ("_"); последующие символы также могут быть цифрами (0-9). Поскольку JavaScript чувствителен к регистру символов, могут использоваться буквы (английские) от "A" до "Z" (верхний регистр) и от "a" до "z" (нижний регистр).
Вот некоторые примеры правильных имен: Number_hits
, temp99
, _name
.
Объявление переменных
Вы может объявить переменную двумя способами:
Вычисление переменных
Переменная или элемент массива, которым не присвоено значение, имеют значение undefined
.
Результат вычисления переменной, не имеющей присвоенного значения зависит от того, как она была объявлена:
- Если переменная без присвоенного значения была объявлена без использования var, вычисление приведет к ошибке времени выполнения/runtime error.
- Если переменная без присвоенного значения была объявлена с использованием var, вычисление даст значение undefined, или NaN - в числовом контексте.
Следующий код демонстрирует вычисление переменных, не имеющих присвоенного значения:
function f1() {
return y - 2;
}
f1() //Вызывает ошибку времени выполнения
function f2() {
return var y - 2;
}
f2() //возвращает NaN
Можно использовать undefined
, чтобы определить, имеет ли переменная
значение. В следующем коде переменной input
не присвоено значение,
и оператор if
вычисляется в true
.
var input;
if(input === undefined){
doThis();
} else {doThat();
}
Значение undefined
ведет себя как false при использовании в
качестве Булева значения. Например, следующий код выполняет функцию myFunction
,
поскольку элемент массива не определен:
myArray=new Array()
if (!myArray[0])
myFunction()
Если вычисляется переменная со значением null, то значение null работает как 0 в числовом контексте и как false - в Булевом контексте. Например:
var n = null
n * 32 //возвращает 0
Область видимости переменной
Если Вы устанавливаете идентификатор переменной путем присвоения вне функции, такая переменная называется глобальной, поскольку доступна в любом месте документа. Если Вы объявляете переменную внутри функции, она называется локальной переменной, поскольку доступна только внутри данной функции.
Использование var
при объявлении глобальной переменной не требуется.
Однако Вы обязаны использовать var
при объявлении переменой внутри функции.
Вы можете получить доступ к глобальным переменным, объявленным в одном окне или
фрэйме, из другого окна или фрэйма, специфицируя имя окна или фрэйма. Например,
если переменная phoneNumber
объявляется в документе FRAMESET
, Вы
можете обратиться к этой переменной из дочернего фрэйма так: parent.phoneNumber
.
Литералы
Литералы используются в JavaScript для представления значений. Это фиксированные значения, не переменные, которые Вы литерально\буквально
предоставляете скрипту.
В этом разделе описаны следующие типы литералов:
- Литералы массива
- Булевы литералы
- Литералы с плавающей точкой
- Целые числа
- Литералы объекта
- Строковые литералы
Литералы массива
Литерал массива это список из 0 или более выражений, каждое из которых представляет элемент массива, заключенный в квадратные скобки ([]). Если Вы создаете массив с использованием литерала массива, он инициализируется специфицированными значениями в качестве элементов и получает размер, равный количеству специфицированных аргументов.
В этом примере создается массив coffees
из трех элементов, имеющий размер 3:
coffees = ["French Roast", "Columbian", "Kona"]
ПРИМЕЧАНИЕ: Литерал массива это тип инициализатора объекта. См. "Использование Инициализаторов Объектов".
Если массив создается путем использования литерала в скрипте верхнего уровня, JavaScript интерпретирует массив каждый раз, когда вычисляет выражение, содержащее литерал массива. Кроме того, используемый в функции литерал создается каждый раз при вызове функции.
Литералы массива являются также Array
-объектами. См. в разделе "Объект Array"
детальную информацию об объектах Array
.
Лишние запятые в литералах массива
Вы не должны специфицировать все элементы в литерале массива. Если Вы поместите
подряд две запятые, создается массив с пробелами для неспецифицированных
значений. В следующем примере создается массив fish
:
fish = ["Lion", , "Angel"]
В это массиве имеются два элемента со значениями и один пустой элемент (fish[0]
равен "Lion", fish[1]
равен undefined, fish[2]
равен "Angel"):
Если Вы вставили ведомую запятую в конце списка элементов, эта запятая
игнорируется. В следующем примере размер массива равен 3. Элемента myList[3]
нет. Все остальные запятые в списке обозначают новый элемент.
myList = ['home', , 'school', ];
В следующем примере размер массива равен 4, а элемент myList[0]
отсутствует.
myList = [ , 'home', , 'school'];
В следующем примере размер массива равен 4, а элемент myList[3]
отсутствует. Игнорируется только последняя запятая. Эта ведомая запятая не обязательна.
myList = ['home', , 'school', , ];
Булевы литералы
Тип Boolean имеет два литеральных значения: true
и false
.
Не путайте Булевы значения true и false со значениями true и false объекта Boolean. Объект Boolean является оболочкой для примитивного типа данных Boolean. См. "Объект Boolean".
Литералы с плавающей точкой
Литерал с плавающей точкой может иметь следующие составные части:
Часть "экспонента" это английская буква "e" или "E" с последующим целым числом, которое может иметь знак (предшествующий "+" или "-"). Литерал с плавающей точкой обязан иметь как минимум одну цифру и десятичную точку, либо "e" (или "E").
Вот некоторые примеры литералов с плавающей точкой: 3.1415, -3.1E12, .1e12, 2E-12
Целые числа
Целые числа могут быть десятеричными (база 10), 16-ричными (база 16) и 8-ричными (база 8).
Десятеричный целочисленный литерал состоит из последовательности цифр без
ведущего нуля (0). Ведущий 0 (нуль) в целочисленном литерале означает, что это
восьмеричное число; ведущие символы 0x (или 0X) указывают, то это 16-ричное
число.
16-ричные цифры могут состоять из цифр (0-9) и английских букв a-f и A-F.
Восьмеричные целые могут состоять только из цифр 0-7.
Вот примеры целочисленных литералов: 42, 0xFFF, -345.
Литералы объекта
Литерал объекта это список из 0 или более пар из имен свойств объекта и их значений, заключенный в фигурные скобки ({}). Вы не должны использовать литерал объекта в начале оператора. Это приведет к ошибке.
Далее идет пример литерала объекта. Первый элемент объекта car
определяет свойство myCar
; второй элемент, свойство getCar
,
вызывает функцию (Cars("honda")
); третий элемент, свойство special
,
использует существующую переменную (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
Кроме того, Вы можете использовать индексирование объекта, свойство index
(например, 7),
или вкладывать объекты друг в друга. В следующем примере используются эти
возможности, однако они могут не поддерживаться другими браузерами, совместимыми с ECMA.
car = {manyCars: {a: "Saab", b: "Jeep"}, 7: "Mazda"}
document.write(car.manyCars.b); // Jeep
document.write(car[7]); // Mazda
Строковые литералы
Строковой литерал это 0 или более символов, заключенных в двойные ("
)
или одинарные ('
) кавычки. Строка должна быть ограничена кавычками
одного вида; то есть, оба знака должны быть " или '. Вот примеры строковых литералов:
"blah"
"1234"
"первая строка \n вторая строка"
Вы можете вызвать любые методы объекта String в строковом литеральном значении - JavaScript
автоматически конвертирует строковой литерал во временный String-объект,
вызывает его методы, затем уничтожает временный String-объект. Вы можете также
использовать свойство String.length
со строковыми литералами.
Вы должны использовать строковые литералы, если только Вам не нужно специально использовать объект String. См. также "Объект String".
Использование специальных символов в строках
Помимо обычных символов, Вы можете также включать в строки специальные символы, как показано в следующем примере.
"одна строка \n другая строка"
В таблице перечислены специальные символы, которые Вы можете использовать в строках JavaScript.
Таблица 2.1 Специальные Символы JavaScript
Символ | Значение |
---|---|
\b | |
\f | |
\n | |
\r | |
\t | |
\' | |
\" | |
\\ | |
\XXX | Символ из набора Latin-1, специфицированный тремя восьмеричными цифрами XXX в диапазоне от 0 до 377. Например, \251 это восьмеричная последовательность для символа 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 (\).
Вы можете вставить знак кавычки внутри строки, введя перед ним 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"
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.
Совместимость Unicode с ASCII и ISO
Unicode совместим с символами ASCII и поддерживается многими программами. Первые 128 символов Unicode соответствуют символам ASCII и имеют те же байтовые значения. Символы Unicode с U+0020 по U+007E эквивалентны символам ASCII с 0x20 по 0x7E. В отличие от ASCII, который поддерживает латинский алфавит и использует набор 7-битных символов, Unicode использует 16-битное значение для каждого символа. Это позволяет кодировать десятки тысяч символов. Unicode версии 2.0 содержит 38 885 символов. Он также поддерживает механизм расширения, Transformation Format (UTF), называемый UTF-16, который позволяет кодировать более миллиона символов путем использования 16-битных пар. UTF включает кодирование в реальные биты.
Unicode полностью совместим с International Standard ISO/IEC 10646-1; 1993, который является поднабором ISO 10646, и поддерживает ISO UCS-2 (Universal Character Set), который использует два восьмеричных значения (два байта или 16 битов).
Поддержка Unicode в JavaScript и в Navigator'е означает, что Вы можете использовать в программах на JavaScript не-латинские, международные и локализованные символы, плюс специальные технические символы. Unicode является стандартным способом кодирования многоязычных текстов. Поскольку Unicode совместим с ASCII, программы могут использовать ASCII-символы. Вы можете использовать не-ASCII символы Unicode в комментариях и строковых литералах JavaScript.
Escape-последовательности Unicode
Вы можете использовать escape-последовательности (замены) Unicode в строковых литералах. Такая escape-последовательность состоит из шести ASCII-символов: \u и четырех 16-ричных цифр. Например, \u00A9 это символ copyright. Каждая escape-последовательность Unicode в JavaScript интерпретируется как одиночный символ.
Следующий код возвращает символ copyright и строку "Netscape Communications".
x="\u00A9 Netscape Communications"
В таблице перечислены часто используемые специальные символы и их Unicode-значения.
Таблица 2.2 Unicode-значения специальных символов
Категория | Unicode-значение | Имя | Format-имя |
---|---|---|---|
JavaScript использует escape-последовательности Unicode иначе, чем Java. В JavaScript escape-последовательность никогда сначала не интерпретируется как специальный символ. Например, последовательность терминатора строки внутри строки не обрывает строку до того как будет интерпретирована функцией. JavaScript игнорирует любую escape-последовательность внутри комментария. В Java, если escape-последовательность используется в однострочном комментарии, она интерпретируется как символ Unicode. Для строкового литерала, компилятор Java сначала интерпретирует escape-последовательности. Например, если escape-символ обрыва строки (\u000A) используется в Java, он обрывает строковой литерал. В Java это приводит к ошибке, поскольку терминаторы строки не допускаются в строковых литералах. Вы обязаны использовать \n для line feed в строковом литерале. В JavaScript эта escape-последовательность работает так же, как \n.
Отображение символов с помощью Unicode
Вы можете использовать Unicode для отображения символов из разных языков или технических символов. Для правильного отображения символов клиент, такой как Netscape Navigator 4.x, должен поддерживать Unicode. Кроме того, клиенту должен быть доступен подходящий шрифт Unicode, а клиентская платформа обязана поддерживать Unicode. Часто шрифты Unicode не отображают все символы Unicode. Некоторые платформы, такие как Windows 95, предоставляют частичную поддержку Unicode.
Для получения ввода не-ASCII символами, клиент должен высылать ввод как Unicode.
Используя стандартную расширенную клавиатуру, клиент не может легко ввести
дополнительные символы, поддерживаемые Unicode. Часто единственным способом
ввести символы Unicode является использование escape-последовательностей Unicode.
Спецификация Unicode, однако, не требует использования escape-последовательностей. Unicode
имеет метод для отображения специальных символов Unicode через использование
составного символа. Он специфицирует порядок символов, который может
использоваться для создания составного символа, где сначала идет базовый символ,
а затем один или более непробельных знаков. Обычные реализации Unicode, включая
реализацию JavaScript, однако, не поддерживают эту опцию. JavaScript не пытается
представить комбинированные последовательности Unicode. Другими словами, ввод a
и '
не даст à
. JavaScript интерпретирует a'
как два различных 16-битных символа Unicode. Вы обязаны использовать escape-последовательности Unicode
или литеральный символ Unicode для отображения символа à
.
Дополнительно о Unicode см. Web-сайт консорциума Unicode Consortium и The Unicode Standard, Version 2.0, опубликованный Addison-Wesley, 1996.