Мобильная версия

Электронная библиотека

Программисту веб-дизайнеру

Другие материалы

Клиентский JavaScript. Руководство по Использованию

Глава 2
Значения, Переменные и Литералы

В этой главе рассматриваются значения, распознаваемые JavaScript, и строительные блоки выражений JavaScript: переменные и литералы.

В главе имеются следующие разделы:

  • Значения
  • Переменные
  • Литералы
  • Unicode
  • Значения

    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.

    Объявление переменных

    Вы может объявить переменную двумя способами:

  • Просто присвоив ей значение. Например, x = 42
  • С помощью ключевого слова var. Например, var x = 42
  • Вычисление переменных

    Переменная или элемент массива, которым не присвоено значение, имеют значение 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".

    Литералы с плавающей точкой

    Литерал с плавающей точкой может иметь следующие составные части:

  • десятеричное целое
  • десятичная точка (".")
  • дробная часть (другое 10-ричное число)
  • экспонента
  • Часть "экспонента" это английская буква "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"

    'blah'

    "1234"

    "первая строка \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.

    \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-имя

    Пробельные символы

    \u0009

    Tab/табуляция

    <TAB>

    \u000B

    Vertical Tab/вертикальная табуляция

    <VT>

    \u000C

    Form Feed/прогон страницы

    <FF>

    \u0020

    Space/пробел

    <SP>

    Терминаторы строки

    \u000A

    Line Feed/прогон строки

    <LF>

    \u000D

    Carriage Return/возврат каретки

    <CR>

    Дополнительные escape-последовательности Unicode

    \u000b

    Backspace

    <BS>

    \u0009

    Horizontal Tab/горизонтальная табуляция

    <HT>

    \u0022

    Double Quote/двойная кавычка

    "

    \u0027

    Single Quote/одинарная кавычка

    '

    \u005C

    Backslash/обратный слэш

    \

    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.

    Оглавление | Назад | Вперед | Индекс

    Мобильная версия

    Сайт для компьютера
    http://www.mat.net.ua