JavaScript (основы). Глава 2. Значения, переменные и литералы
Оглавление | Назад | Вперёд | ИндексГлава 2. Значения, переменные и литералы
В этой главе рассматриваются значения, распознаваемые JavaScript, и строительные блоки выражений JavaScript: переменные и литералы.
В главе имеются следующие разделы:
Значения
Этот сравнительно небольшой набор типов значений, или типов данных, даёт Вашим приложениям возможность выполнять различные функции. Отсутствует явное различие между целыми и реальными числами. Нет также типа данных date. Однако Вы может использовать объект Date и его методы для работы с датами.
Объекты и функции также являются основными элементами языка. Можно считать объекты именованными контейнерами значений, а функции - процедурами, которые Ваше приложение выполняет.
Конвертация типов данных
JavaScript это динамически типизированный язык. Это означает, что Вы не должны специфицировать тип данных переменной при её объявлении и что типы данных при необходимости автоматически конвертируются при выполнении скрипта. Так, например, Вы можете объявить переменную:
и позднее присвоить этой же переменной строковое значение, например,
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 // возвращает 377
Переменные
Вы используете переменные как символические имена для значений. Вы даёте переменной имя, по которому Вы ссылаетесь на неё и которое обязано соответствовать определённым требованиям.
Идентификатор в JavaScript, или name\имя, обязан начинаться с буквы или символа подчёркивания ("_"); последующие символы также могут быть цифрами (0-9). Поскольку JavaScript чувствителен к регистру символов, могут использоваться буквы (английские) от "A" до "Z" (верхний регистр) и от "a" до "z" (нижний регистр).
Вот некоторые примеры правильных имён: Number_hits, temp99, _name.
Объявление переменных
Вычисление переменных
Переменная или элемент массива, которым не присвоено значение, имеют значение undefined. Результат вычисления переменной, не имеющей присвоенного значения зависит от того, как она была объявлена:
Следующий код демонстрирует вычисление переменных, не имеющих присвоенного значения:
return y - 2}
f1() //Вызывает ошибку времени выполнения
return var y - 2}
f2() //возвращает NaN
Можно использовать undefined, чтобы определить, имеет ли переменная значение. В следующем коде переменной input не присвоено значение, и оператор if вычисляется в true.
if(input === undefined){
doThis()} else {
doThat()}
Значение undefined ведёт себя как false при использовании в качестве Булева значения. Например, следующий код выполняет функцию myFunction, поскольку элемент массива не определён:
if(!myArray[0])
myFunction()
Если вычисляется переменная со значением null, то значение null работает как 0 в числовом контексте и как false - в Булевом контексте. Например:
n * 32 //возвращает 0
Область видимости переменной
Если Вы устанавливаете идентификатор переменной путём присвоения вне функции, такая переменная называется глобальной, поскольку доступна в любом месте документа. Если Вы объявляете переменную внутри функции, она называется локальной переменной, поскольку доступна только внутри данной функции.
Использование var при объявлении глобальной переменной не требуется. Однако Вы обязаны использовать var при объявлении переменой внутри функции.
Вы можете получить доступ к глобальным переменным, объявленным в одном окне или фрэйме, из другого окна или фрэйма, специфицируя имя окна или фрэйма. Например, если переменная phoneNumber объявляется в документе FRAMESET, Вы можете обратиться к этой переменной из дочернего фрэйма так: parent.phoneNumber.
Литералы
Литералы используются в JavaScript для представления значений. Это фиксированные значения, не переменные, которые Вы литерально\буквально предоставляете скрипту.
В этом разделе описаны следующие типы литералов:
Литералы массива
Литерал массива это список из 0 или более выражений, каждое из которых представляет элемент массива, заключённый в квадратные скобки ([]). Если Вы создаёте массив с использованием литерала массива, он инициализируется специфицированными значениями в качестве элементов и получает размер, равный количеству специфицированных аргументов.
В этом примере создаётся массив coffees из трёх элементов, имеющий размер 3:
coffees=["French Roast", "Columbian", "Kona"]
ПРИМЕЧАНИЕ:
Литерал массива это тип инициализатора объекта. См. "Использование Инициализаторов Объектов".
Если массив создаётся путём использования литерала в скрипте верхнего уровня, JavaScript интерпретирует массив каждый раз, когда вычисляет выражение, содержащее литерал массива. Кроме того, используемый в функции литерал создаётся каждый раз при вызове функции.
Литералы массива являются также Array -объектами. См. в разделе "Объект Array" детальную информацию об объектах Array.
Лишние запятые в литералах массива
Вы не должны специфицировать все элементы в литерале массива. Если Вы поместите подряд две запятые, создаётся массив с пробелами для неспецифицированных значений. В следующем примере создаётся массив fish:
В это массиве имеются 2 элемента со значениями и 1 пустой элемент ( fish[0] равен "Lion", fish[1] равен undefined, fish[2] равен "Angel"):
Если Вы вставили ведомую запятую в конце списка элементов, эта запятая игнорируется. В следующем примере размер массива равен 3. Элемента myList[3] нет. Все остальные запятые в списке обозначают новый элемент.
В следующем примере размер массива равен 4, а элемент myList[0] отсутствует.
В следующем примере размер массива равен 4, а элемент myList[3] отсутствует. Игнорируется только последняя запятая. Эта ведомая запятая не обязательна.
myList=['home',, 'school',, ];
Булевы литералы
Тип Boolean имеет 2 литеральных значения: 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).
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 или более символов, заключённых в двойные ( ") или одинарные ( ') кавычки. Строка должна быть ограничена кавычками одного вида; то есть, оба знака должны быть " или '. Вот примеры строковых литералов:
"первая строка \n вторая строка"
Вы можете вызвать любые методы объекта String в строковом литеральном значении - JavaScript автоматически конвертирует строковой литерал во временный String-объект, вызывает его методы, затем уничтожает временный String-объект. Вы можете также использовать свойство String.length со строковыми литералами.
Вы должны использовать строковые литералы, если только Вам не нужно специально использовать объект String. См. также "Объект String".
Использование специальных символов в строках
Помимо обычных символов, Вы можете также включать в строки специальные символы, как показано в следующем примере.
"одна строка \n другая строка"
В таблице перечислены специальные символы, которые Вы можете использовать в строках JavaScript.
Таблица 2.1 Специальные Символы JavaScript
Символ | Значение |
---|---|
\b | Backspace |
\f | Form feed/прогон страницы |
\n | New line/новая строка |
\r | Carriage return/возврат каретки |
\t | Tab/табуляция |
\' | Апостроф или одинарная кавычка |
\" | Двойная кавычка |
\\ | Обратный слэш (\) |
\ XXX | Символ из набора Latin-1, специфицированный тремя восьмеричными цифрами XXX в диапазоне от 0 до 377. Например, \251 это восьмеричная последовательность для символа copyright. |
\x XX | Символ из набора Latin-1, специфицированный двумя 16-ричными цифрами XX в диапазоне от 00 до FF. Например, \xA9 это 16-ричная последовательность для символа copyright. |
\u XXXX | Символ 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 запишите так:
Unicode
Unicode это универсальный стандарт кодирования символов для обмена и отображения символов основных письменных языков. Он покрывает языки Америки, Европы, Среднего Востока, Африки, Индии, Азии и Океании, а также мёртвые языки и технические символы. Unicode даёт возможность передавать, обрабатывать и отображать многоязычные тексты, а также использовать общепринятые математические и технические символы. Таким образом предполагается разрешить проблемы интернационализации в многоязычной компьютерной среде, такие как различные национальные символьные стандарты. Не все современные и архаичные виды письма, однако, поддерживаются в настоящее время.
Набор символов Unicode можно использовать для всех известных кодировок. Unicode смоделирован после набора ASCII (American Standard Code for Information Interchange). В нём используется числовое значение и имя для каждого символа. Кодировка символов специфицирует идентификацию символа и числовое значение (кодовую позицию), а также битовое представление этого значения. 16-битное числовое значение (кодовое значение) определяется 16-ричным числом и префиксом U, например, U+0041 представляет букву A. Уникальное имя для этого символа - LATIN CAPITAL LETTER A.
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), который использует 2 восьмеричных значения (два байта или 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-значения специальных символов
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 через использование составного символа. Он специфицирует порядок символов, который может использоваться для создания составного символа, где сначала идёт базовый символ, а затем 1 или более непробельных знаков. Обычные реализации Unicode, включая реализацию JavaScript, однако, не поддерживают эту опцию. JavaScript не пытается представить комбинированные последовательности Unicode. Другими словами, ввод a и ' не даст à. JavaScript интерпретирует a' как 2 различных 16-битных символа Unicode. Вы обязаны использовать escape-последовательности Unicode или литеральный символ Unicode для отображения символа à.
Оглавление | Назад | Вперёд | Индекс