Ядро JavaScript 1.5. Руководство по использованию

Аргументы Типа char

В JavaScript 1.4 и позднее Вы можете передавать строку из одного символа в Java-метод, который требует аргумент типа char. Например, Вы можете передать строку "H" в конструктор Character:
c = new java.lang.Character("H")
В JavaScript 1.3 и ранее Вы обязаны передавать в такие методы целое число, соответствующее Unicode-значению символа. Например, следующий код также присваивает значение "H" переменной c:
c = new java.lang.Character(72)


Арифметические Операции

Арифметические операции принимают числовые значения (литералы или переменные) в качестве операндов и возвращают одиночное числовое значение. Стандартными арифметическими операциями являются сложение (+), вычитание (-), умножение (*) и деление (/). Эти операции работают так же, как и во многих других языках программирования, но операция / в JavaScript возвращает результат деления с плавающей точкой, а не округлённое частное, как в языках программирования C или Java. Например:

1/2 //возвращает 0.5 в JavaScript
1/2 //возвращает 0 в Java

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



Таблица 3.3 Арифметические Операции



Операция
Описание
Пример

%
(Modulus) Бинарная операция. Возвращает целочисленный остаток от деления двух операндов. 12 % 5 возвращает 2. ++
(Инкремент) Унарная операция. Добавляет 1 к операнду. Если используется как префикс (++x), добавляет единицу и возвращает значение операнда; если используется как постфикс (x++), возвращает значение операнда и затем прибавляет единицу. Если x равен 3, то ++x устанавливает x в 4 и возвращает 4; а x++ устанавливает x в 4 и возвращает 3.
--
(Декремент) Унарная операция. Вычитает единицу из операнда. Возвращаемое значение аналогично значению для операции инкремента.
Если x равен 3, то --x устанавливает x в 2 и возвращает 2; а x-- устанавливает x в 2 и возвращает 3.
-
(Унарное отрицание) Унарная операция. Возвращает операнд с изменённым знаком. Если x равен -3, то -x возвращает 3.




Блок Операторов

Блок операторов используется для группирования операторов. Блок ограничен фигурными скобками:
{statement1 statement2 . . .statementn}




Более Гибкие Конструкторы

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

Рисунок 8.5 Специфицирование свойств в конструкторе, шаг 1



Более Гибкие Конструкторы
В таблице даны определения Java и JavaScript для этих объектов.

JavaScriptJava

function Employee (name, dept) {

this.name = name "";

this.dept = dept "general";

}

public class Employee {

public String name;

public String dept;

public Employee () {

this("", "general");

}

public Employee (name) {

this(name, "general");

}

public Employee (name, dept) {

this.name = name;

this.dept = dept;

}

}

function WorkerBee (projs) {

this.projects = projs [];

}

WorkerBee.prototype = new Employee;

public class WorkerBee extends Employee {

public String[] projects;

public WorkerBee () {

this(new String[0]);

}

public WorkerBee (String[] projs) {

this.projects = projs;

}

}

function Engineer (mach) {

this.dept = "engineering";

this.machine = mach "";

}

Engineer.prototype = new WorkerBee;

public class Engineer extends WorkerBee {

public String machine;

public WorkerBee () {

this.dept = "engineering";

this.machine = "";

}

public WorkerBee (mach) {

this.dept = "engineering";

this.machine = mach;

}

}
<

Эти определения JavaScript используют специальную идиому для установки значений по умолчанию:

this.name = name "";

Операция JavaScript "логическое ИЛИ" () вычисляет свой первый аргумент. Если он конвертируется в true, операция возвращает его. Иначе, операция возвращает значение второго аргумента. Следовательно, эта строка кода проверяет, имеет ли name используемое значение для свойства name. Если это так, в this.name устанавливается это значение. В ином случае, в this.name устанавливается пустая строка. В этой главе используется эта идиома используется для краткости; однако это может на первый взгляд показаться непонятным.

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

jane = new Engineer("belau");

Jane-свойства теперь:

jane.name == "";

jane.dept == "general";

jane.projects == [];

jane.machine == "belau"

Заметьте, что с помощью этих определений Вы не можете специфицировать начальное значение наследуемого свойства, такого как name. Если Вы не хотите специфицировать начальные значения наследуемых свойств в JavaScript, Вам нужно добавить дополнительный код в конструктор функции.

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


Рисунок 8.6   Специфицирование свойств в конструкторе, шаг 2



Более Гибкие Конструкторы

Давайте рассмотрим одно из этих определений подробнее. Вот новое определение конструктора Engineer:

function Engineer (name, projs, mach) {

this.base = WorkerBee;

this.base(name, "engineering", projs);

this.machine = mach "";

}

Предположим, Вы создаёте новый Engineer-объект:


jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");

JavaScript выполняет следующие шаги:



  • Оператор new создаёт общий объект и устанавливает в его свойство __proto__ значение Engineer.prototype.


  • Оператор new передаёт новый объект Engineer-конструктору как значение ключевого слова this.


  • Конструктор создаёт новое свойство base для этого объекта и присваивает значение конструктора WorkerBee свойству base. Это делает конструктор WorkerBee методом Engineer-объекта.

    Имя свойства base не является специальным. Вы можете использовать любое правильное имя свойства; base просто более понятно в данной ситуации.



  • Конструктор вызывает метод base, передавая в качестве его аргументов два из аргументов, переданных конструктору ("Doe, Jane" и ["navigator", "javascript"]), а также строку "engineering". Явное использование "engineering" в конструкторе указывает, что все Engineer-объекты имеют одинаковые значения для наследуемого свойства dept и это значение переопределяет значение, унаследованное от Employee.


  • Поскольку base является методом в Engineer, внутри вызова base JavaScript связывает ключевое слово this с объектом, созданным в . Таким образом, функция WorkerBee, в свою очередь, передаёт аргументы "Doe, Jane" и ["navigator", "javascript"] конструктору функции Employee. После возвращения из конструктора функции Employee, функция WorkerBee использует остальные аргументы для установки свойства projects.


  • После возвращения из метода base, конструктор Engineer инициализирует свойство machine объекта значением "belau".


  • После возвращения из конструктора, JavaScript присваивает новый объект переменной jane.


  • Вы можете подумать, что, имея вызов конструктора WorkerBee из конструктора Engineer, Вы установили соответствующее наследование для Engineer-объектов, но это не так. Вызов конструктора WorkerBee гарантирует, что Engineer-объект стартует со свойствами, специфицированными во всех конструкторах функций, которые были вызваны. Однако, если Вы позднее добавите свойства к прототипам Employee или WorkerBee, эти свойства не будут наследоваться Engineer-объектом. Например, мы имеем следующие операторы:


    function Engineer (name, projs, mach) {

    this.base = WorkerBee;

    this.base(name, "engineering", projs);

    this.machine = mach "";

    }

    jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");

    Employee.prototype.specialty = "none";

    Объект jane не наследует свойство specialty. Вы всё ещё должны явно установить прототип, чтобы гарантировать динамическое наследование. Предположим, у нас есть такие операторы:

    function Engineer (name, projs, mach) {

    this.base = WorkerBee;

    this.base(name, "engineering", projs);

    this.machine = mach "";

    }

    Engineer.prototype = new WorkerBee;

    jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");

    Employee.prototype.specialty = "none";

    Теперь значение свойства specialty объекта jane установлено в "none".



    Булевы Литералы

    Тип Boolean имеет два литеральных значения: true и false.

    Не путайте примитивные Boolean-значения true и false со значениями true и false объекта Boolean. Объект Boolean является "обёрткой"-оболочкой примитивного типа данных Boolean. См. .




    Булевы Значения

    Если Вы передаёте Булевы типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    boolean
    Все значения конвертируются непосредственно в Java-эквиваленты.
    lava.lang.Boolean
    java.lang.Object
    Создаётся новый экземпляр объекта java.lang.Boolean. Каждый параметр создаёт новый экземпляр, а не один экземпляр с тем же примитивным значением.
    java.lang.String
    Значения конвертируются в строки. Например:

    true становится "true"
    false становится "false"

    byte
    char
    double
    float
    int
    long
    short

    true становится 1 false становится 0
    Если Булево значение JavaScript передаётся в качестве параметра Java-методу, ожидающему экземпляр объекта java.lang.String, Булево значение конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.


    Целочисленные Литералы

    Целые числа могут иметь десятеричную базу (база 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.



    Числа

    Если Вы передаёте числовые типы JavaScript в качестве параметров методам Java, Java конвертирует эти значения в соответствии с правилами, описанными в следующей таблице:

    Тип
    Java-параметра
    Правила Конверсии

    double
    Точное значение переносится в Java без округления и без потери точности или знака.
    lava.lang.Double
    java.lang.Object
    Создаётся новый экземпляр java.lang.Double, и точное значение передаётся в Java без округления и без потери точности или знака.
    float

    Значения округляются до чисел с плавающей точкой. Значения, которые слишком малы или велики, чтобы быть представленными, округляются до +infinity или -infinity.

    byte
    char
    int
    long
    short

    Значения округляются с использованием режима round-to-negative-infinity/округление-в-сторону-отрицательной-бесконечности. Значения, которые слишком малы или велики, чтобы быть представленными, дают ошибку времени выполнения.
    Значения NaN конвертируются до нуля.

    java.lang.String
    Значения конвертируются в строки. Например,
    237 становится "237"
    boolean

    Значения 0 и NaN конвертируются в false. Другие значения конвертируются в true.
    Если число JavaScript передаётся в качестве параметра в Java-метод, который ожидает экземпляр объекта java.lang.String, это число конвертируется в строку. Используйте метод equals() для сравнения результата этой конвертации с другими строковыми значениями.


    Что Такое JavaScript?

    JavaScript это созданный фирмой Netscape межплатформенный объектно-ориентированный язык скриптинга (сценариев). JavaScript это небольшой компактный язык; он не используется для создания самостоятельных приложений, а разработан специально для упрощенного внедрения в другие приложения и продукты, такие как web-браузеры. Находясь внутри рабочей среды-хозяина, JavaScript может подключаться к объектам этой среды для предоставления программного управления ими.

    Ядро JavaScript содержит набор основных объектов, таких как Array, Date и Math, и основной набор элементов языка, таких как операции, управляющие структуры и операторы. Ядро JavaScript может быть расширено для различных целей путём дополнения его новыми объектами; например:

  • Клиентский JavaScript расширяет ядро языка, добавляя объекты управления браузером (Navigator или другой аналогичный web-браузер) и Document Object Model/Объектную Модель Документа (DOM). Например, клиентские расширения позволяют приложению размещать элементы на HTML-форме и реагировать на пользовательские события, такие как щелчок мышью, ввод данных в форму или навигация по страницам.

  • Серверный JavaScript расширяет ядро языка, добавляя объекты, относящиеся к запуску JavaScript на сервере. Например, серверные расширения позволяют приложению взаимодействовать с реляционной базой данных, сохраняя информацию между вызовами приложения, или выполнять манипуляции с файлами на сервере.

  • Посредством функциональности LiveConnect, Вы можете осуществлять взаимодействие кодов Java и JavaScript. Из JavaScript Вы можете инстанциировать Java-объекты и получать доступ к их public-методам и полям. Из Java Вы можете иметь доступ к объектам, свойствам и методам JavaScript.
    Netscape изобрела JavaScript, и JavaScript был впервые использован в браузерах Netscape.



    Что Вы Уже Должны Знать

    Предполагается, что Вы уже имеете базовые знания:

  • Общее понятие об Internet и World Wide Web (WWW).
  • Хорошее владение HyperText Markup Language (HTML).

  • Некоторый опыт программирования в таких языках как C или Visual Basic (не обязательно).



    Delete

    Операция delete удаляет объект, свойство объекта или элемент массива по специфицированному индексу. Синтаксис таков:

    delete objectName
    delete objectName.property

    delete objectName[index]

    delete property // верно только внутри оператора with

    где objectName это имя объекта, property это существующее свойство, а index это целое число - место элемента в массиве.

    Четвёртая форма верна только внутри оператора with при удалении свойства объекта.

    Можно использовать операцию delete для удаления переменных, объявленных неявно, но не переменных, объявленных оператором var.

    Если операция delete выполнена успешно, она устанавливает свойство или элемент в undefined. Операция delete возвращает true, если операция возможна, и false - если операция невозможна.

    x=42
    var y= 43
    myobj=new Number()

    myobj.h=4 // создаёт свойство h

    delete x // возвращает true (может удалить, если х объявлена неявно)

    delete y // возвращает false (не может удалить, если у объявлена через var)

    delete Math.PI // возвращает false (не может удалить предопределённое свойство)

    delete myobj.h // возвращает true (может удалить свойство, определённое пользователем)

    delete myobj // возвращает true (может удалить, если myobj объявлен неявно)


    Удаление элемента массива

    Если Вы удаляете элемент массива, размер массива не изменяется. Например, если удалить a[3], a[4] всё ещё остаётся a[4], а a[3] станет undefined.

    Если операция delete удаляет элемент массива, этот элемент больше не присутствует в массиве. В следующем примере trees[3] удаляется с помощью delete.

    trees=new Array("redwood","bay","cedar","oak","maple")

    delete trees[3]

    if (3 in trees) {

    // это не будет выполняться

    }

    Если Вы хотите, чтобы элемент массива существовал, но имел значение undefined/неопределённое, используйте ключевое слово undefined вместо операции delete. В следующем примере элементу trees[3] присваивается значение undefined, но элемент массива продолжает существовать:

    trees=new Array("redwood","bay","cedar","oak","maple")

    trees[3]=undefined

    if (3 in trees) {

    // это будет выполняться

    }



    Добавление и Удаление Свойств

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



    Добавление Свойств

    В JavaScript Вы можете добавлять свойства любому объекту на этапе прогона программы. Отсутствует ограничение на использование только свойств, предоставленных конструктором функции. Чтобы добавить свойство отдельному объекту, Вы присваиваете значение этому свойству объекта таким образом:
    mark.bonus = 3000;
    Теперь объект mark имеет свойство bonus, но другие потомки WorkerBee этого свойства не имеют.

    Если Вы добавляете новое свойство объекту, который используется как прототип конструктора функции, вы добавляете это свойство всем объектам, наследующим свойства от этого прототипа. Например, Вы можете добавить свойство specialty всем employee с помощью следующего оператора:
    Employee.prototype.specialty = "none";
    Когда JavaScript выполнит этот оператор, объект mark также получит свойство specialty со значением "none". На рисунке показано эффект от добавления этого свойства прототипу Employee и последующего переопределения этого свойства для прототипа Engineer.


    Рисунок 8.4 Добавление Свойств



    Добавление Свойств




    Документация JavaScript и Спецификация ECMA

    Спецификация ECMA это набор требований по реализации ECMAScript; она необходима, если Вы хотите убедиться, что данная возможность JavaScript поддерживается ECMA. Если Вы планируете писать код JavaScript, использующий только поддерживаемые ECMA возможности, то Вам, возможно, понадобится просмотреть и спецификацию ECMA.
    Документ ECMA не предназначен для помощи программистам - создателям скриптов; для получения информации о написании скриптов используйте документацию JavaScript.



    Доступ к JavaScript через JSObject

    Например, предположим, Вы работаете с Java-классом JavaDog. Как показано в следующем коде, конструктор JavaDog принимает в качестве аргумента JavaScript-объект jsDog, который определён как имеющий тип JSObject:
    import netscape.javascript.*;

    public class JavaDog

    {

    public String dogBreed;

    public String dogColor;

    public String dogSex;

    // определяется конструктор класса

    public JavaDog(JSObject jsDog)

    {

    // здесь try...catch используется для обработки JSExceptions

    this.dogBreed = (String)jsDog.getMember("breed");

    this.dogColor = (String)jsDog.getMember("color");

    this.dogSex = (String)jsDog.getMember("sex");

    }

    }
    Обратите внимание, что метод getMember из JSObject используется для доступа к свойствам JavaScript-объекта. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed члену данных Java JavaDog.dogBreed.

    Примечание

    Более жизненный пример - помещение вызова метода getMember внутрь блока try...catch для обработки ошибок типа JSException. См. также .
    Чтобы лучше понять, как работает getMember, посмотрите на определение специального JavaScript-объекта Dog:
    function Dog(breed,color,sex) {

    this.breed = breed

    this.color = color

    this.sex = sex

    }
    Вы можете создать в JavaScript экземпляр объекта Dog под названием gabby:

    gabby = new Dog("lab","chocolate","female")
    Если Вы вычисляете gabby.color, то увидите, что это свойство имеет значение "chocolate". Теперь предположим, что Вы создаёте экземпляр JavaDog в Вашем JavaScript-коде, передавая конструктору объект gabby:
    javaDog = new Packages.JavaDog(gabby)
    Если Вы вычисляете javaDog.dogColor, то увидите, что это свойство также имеет значение "chocolate", потому что метод getMember в Java-конструкторе присваивает переменной dogColor значение свойства gabby.color.


    Другие Объекты JavaScript

    Если Вы передаёте любой иной объект JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    java.lang.JSObject
    java.lang.Object
    Объект разворачивается в новый экземпляр объекта java.lang.JSObject.
    java.lang.String
    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.
    byte
    char
    double
    float
    int
    long
    short
    Объект конвертируется в значение с использованием логики оператора ToPrimitive, описанного в . Подсказка PreferredType, используемая с этим оператором, является Number.
    boolean
    В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:


    Если объект - null, он конвертируется в false.
    Если объект имеет какое-либо другое значение, он конвертируется в true.
    В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:


    Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
    Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.


    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 Табуляция \u000BВертикальная табуляция
    \u000CПрогон страницы \u0020Пробел Значения конца строки \u000AПрогон строки \u000DВозврат каретки Дополнительные последовательности Unicode
    \u0008Backspace \u0009Горизонтальная табуляция \u0022Двойная кавычка " \u0027Одинарная кавычка '\u005C
    Backslash\

    Использование escape-последовательнотей Unicode в JavaScript отличается от Java. В JavaScript escape-последовательность сразу никогда не интерпретируется как спецсимвол. Например, последовательность терминатора строки внутри строки не оканчивает строку до того, как она будет интерпретирована функцией. JavaScript игнорирует любую escape-последовательность, если она находится в комментарии. В Java, если escape-последовательность используется в однострочном комментарии, она интерпретируется как символ Unicode. В строковом литерале компилятор Java сначала интерпретирует escape-последовательности. Например, если последовательность "терминатор строки" (\u000A) используется в Java, она оканчивает строковой литерал. В Java это приводит к ошибке, поскольку терминаторы строки не допускаются в строковых литералах. Вы обязаны использовать \n в строковом литерале в качестве символа новой строки. В JavaScript escape-последовательность работает так же, как \n.



    Функции escape и unescape

    Функции escape и unescape позволяют Вам кодировать и декодировать строки. Функция escape возвращает 16-ричное кодированное представление аргумента - набора символов ISO Latin. Функция unescape возвращает ASCII-строку для специфицированного аргумента - 16-ричного кодированного значения.

    Синтаксис этих функций таков:

    escape(string)

    unescape(string)

    Эти функции используются в основном в серверном JavaScript для кодирования и декодирования пар имя/значение в URL.
    Функции escape и unescape неправильно работают с не- ASCII символами.

    В JavaScript 1.5 и далее, используйте encodeURI, decodeURI, encodeURIComponent и decodeURIComponent.




    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Функции Number и String

    Функции Number и String позволяют конвертировать объект в число или строку. Синтаксис этих функций таков:


    Number(objRef)
    String(objRef)

    где objRef это ссылка на объект.

    Следующий код конвертирует объект Date в читабельную строку:

    D = new Date (430054663215)

    // возвращается следующее

    // "Thu Aug 18 04:37:43 GMT-0700 (Pacific Daylight Time) 1983"

    x = String(D)



    Функции parseInt и parseFloat

    Две "разбирающие" функции, parseInt и parseFloat, возвращают числовое значение, имея в качестве аргумента строку.

    Синтаксис parseFloat:

    parseFloat(str)
    где parseFloat разбирает свой аргумент, строку str, и пытается возвратить число с плавающей точкой. Если она обнаруживает символ, отличный от знака (+ или -), цифры (0-9), десятичной точки или экспоненты, тогда она возвращает значение до этой позиции и игнорирует этот символ и последующие символы. Если первый символ не может быть конвертирован в число, функция возвращает "NaN" (не-число).

    Синтаксис parseInt:

    parseInt(str [, radix])
    parseInt разбирает свой первый аргумент, строку str, и пытается вернуть целое число со специфицированным основанием (radix), обозначенным вторым необязательным аргументом, radix. Например, radix 10 означает конвертацию к десятеричному числу, 8 - восьмеричному, 16 - шестнадцатеричному и так далее. Для radix свыше 10, буквы алфавита обозначают цифры больше 9. Например, для 16-ричных чисел (база 16), используются буквы от A до F.

    Если parseInt вычисляет символ, который не является числом со специфицированным основанием, она игнорирует это число и все последующие символы и возвратит целое число, разобранное до этой позиции. Если первый символ не может быть конвертирован в число со специфицированным основанием, возвращается "NaN." Функция parseInt усекает строку до целочисленного значения.



    Функция eval

    Функция eval вычисляет строку кода JavaScript без ссылки на конкретный объект. Синтаксис eval таков:

    eval(expr)
    где expr это вычисляемая строка.
    Если строка представляет собой выражение, eval вычисляет это выражение. Если аргументом является один или более операторов JavaScript, eval выполняет эти операторы. Не вызывайте eval для вычисления арифметических выражений; JavaScript вычисляет арифметические выражения автоматически.



    Функция isFinite

    Функция isFinite вычисляет аргумент для определения конечности числа. Синтаксис isFinite таков:

    isFinite(number)

    где number это обсчитываемое число.

    Если аргумент имеет значение NaN, положительная или отрицательная бесконечность, этот метод возвращает false, иначе возвращает true.
    Следующий код проверяет ввод клиента для определения конечности введённого числа.
    if(isFinite(ClientInput) == true)

    {

    /* специфицированные шаги */

    }



    Функция isNaN

    Функция isNaN вычисляет, является ли аргумент "NaN" (не-числом). Синтаксис isNaN:

    isNaN(testValue)

    где testValue это вычисляемое выражение.

    Функции parseFloat и parseInt возвращают "NaN", если они вычисляют значение, не являющееся числом. isNaN возвращает true, если передано "NaN," и false - в ином случае.

    Следующий код вычисляет floatValue для определения, является ли оно числом, а затем вызывает соответствующую процедуру:

    floatValue=parseFloat(toFloat)
    if (isNaN(floatValue)) {

    notFloat()

    } else {

    isFloat()

    }



    Где Найти Информацию о JavaScript

    Документация о ядре JavaScript состоит из следующих книг:

  • (эта книга) предоставляет информацию о ядре языка JavaScript и его объектах.
  • Книга содержит справочный материал о ядре языка JavaScript.

  • Если Вы новичок в JavaScript, начните с книги . После того как Вы овладеете основами, можете использовать книгу . для получения более детальной информации об объектах и операторах.

    DevEdge, онлайновый ресурс Netscape для разработчиков, содержит информацию, которая поможет при работе с JavaScript. Следующие URL представляют особый интерес:

    Страница JavaScript библиотеки DevEdge содержит документацию о JavaScript. Эта страница часто изменяется. Вы должны периодически посещать её для получения свежей информации.



    Библиотека DevEdge содержит документацию о многочисленных продуктах и технологиях Netscape.



    Домашняя страница DevEdge - доступ ко всем ресурсам DevEdge.



    Mozilla.org координирует усилия по разработке Mozilla-браузера, открытого ресурса. на котором базируется Netscape 6. Вы можете найти на странице JavaScript-проекта информацию о JavaScript, а также дискуссию по вопросам JavaScript в публичной группе новостей netscape.public.mozilla.jseng.



    Глобальная Информация в Конструкторах

    Когда Вы создаёте конструкторы, нужно проявлять осторожность при установке глобальной информации в конструкторе. Например, предположим, Вы хотите автоматически присваивать уникальный ID каждому новому employee. Вы можете использовать для Employee следующее определение:

    var idCounter = 1;
    function Employee (name, dept) {

    this.name = name "";

    this.dept = dept "general";

    this.id = idCounter++;

    }
    При таком определении, когда Вы создаёте новый Employee-объект, конструктор присваивает ему следующий порядковый ID и выполняет затем инкремент глобального счётчика ID. Так, если Ваш следующий оператор будет таким, как ниже, victoria.id будет 1, а harry.id будет 2:
    victoria = new Employee("Pigbert, Victoria", "pubs")

    harry = new Employee("Tschopik, Harry", "sales")
    На первый взгляд - всё отлично. Однако idCounter будет увеличиваться каждый раз при создании Employee-объекта. Если Вы создаёте всю иерархию Employee, данную в этой главе, конструктор Employee вызывается каждый раз, когда Вы устанавливаете прототип. Предположим, у Вас есть такой код:
    var idCounter = 1;
    function Employee (name, dept) {

    this.name = name "";

    this.dept = dept "general";

    this.id = idCounter++;

    }
    function Manager (name, dept, reports) {...}

    Manager.prototype = new Employee;
    function WorkerBee (name, dept, projs) {...}

    WorkerBee.prototype = new Employee;
    function Engineer (name, projs, mach) {...}

    Engineer.prototype = new WorkerBee;
    function SalesPerson (name, projs, quota) {...}

    SalesPerson.prototype = new WorkerBee;
    mac = new Engineer("Wood, Mac");
    Предположим далее, что отсутствующие здесь определения имеют свойство base и вызывают конструктор, находящийся над ним в цепи прототипов. В этом случае, когда создаётся объект mac, mac.id будет 5.
    В зависимости от приложения, такое излишнее увеличение счётчика может иметь или не иметь значения. Если Вас интересует точное значение счётчика, реализуется ещё одно дополнительное решение путём использования следующего конструктора:
    function Employee (name, dept) {

    this.name = name "";

    this.dept = dept "general";

    if (name)

    this.id = idCounter++;

    }

    Если Вы создаёте экземпляр объекта Employee для использования в качестве прототипа, Вы не должны предоставлять аргументы конструктору. Если Вы используете это определение конструктора и не предоставляете аргументы, конструктор не присваивает значение идентификатору id и не обновляет значение счётчика. Следовательно, для того чтобы Employee получил присвоенный id, Вы обязаны специфицировать name для employee. В этом примере, mac.id будет 1.




    In

    Операция in возвращает true, если специфицированное свойство имеется в специфицированном объекте. Синтаксис таков:

    propNameOrNumber in objectName

    где propNameOrNumber это строка или числовое выражение, представляющее имя свойства или индекс массива, а objectName это имя объекта.

    Некоторые примеры использования операции in:

    // Массивы

    trees=new Array("redwood","bay","cedar","oak","maple")

    0 in trees // возвращает true

    3 in trees // возвращает true

    6 in trees // возвращает false

    "bay" in trees // возвращает false (Вы обязаны специфицировать число индекса,

    // а не значение, находящееся по этому индексу)

    "length" in trees // возвращает true (length это Array-свойство)

    // Предопределённые объекты

    "PI" in Math // возвращает true

    myString=new String("coral")
    "length" in myString // возвращает true

    // Специальные объекты

    mycar = {make:"Honda",model:"Accord",year:1998}
    "make" in mycar // возвращает true

    "model" in mycar // возвращает true



    Индексирование Свойств Объекта

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

    Это применимо при создании объекта и его свойств с помощью конструктора функции, как в примере с типом объекта Car, и если Вы определяете отдельные свойства явным образом (например, myCar.color = "red"). Так, если Вы определили свойства объекта по индексу, как, например, myCar[5] = "25 mpg", Вы можете затем обращаться к этому свойству только как myCar[5].
    Исключением из этого правила являются объекты, отражённые из HTML, такие как массивы форм. Вы всегда обращаетесь к этим объектам по порядковому номеру (зависящим от местонахождения объекта в документе) или по их именам (если они определены). Например, если второй тэг
    в документе имеет в атрибуте NAME значение "myForm", Вы можете ссылаться на форму document.forms[1], или document.forms["myForm"] или document.myForm.




    Instanceof

    Операция instanceof возвращает true, если специфицированный объект имеет специфицированный тип объекта. Синтаксис:

    objectName instanceof objectType

    где objectName это имя объекта, сравниваемого с objectType, а objectType это тип объекта, такой как Date или Array.

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

    Например, следующий код использует instanceof для определения того, является ли theDay Date-объектом. Поскольку theDay это Date-объект, операторы в операторе if выполняются.

    theDay=new Date(1995, 12, 17)

    if (theDay instanceof Date) {
    // выполняемые операторы

    }

    Использование Инициализаторов Объектов

    Помимо создания объектов с использованием конструктора функции, Вы можете создать объекты, используя инициализаторы объектов. Использование инициализаторов иногда называется созданием объектов в литеральной нотации. "Инициализатор Объекта" следует терминологии C++.

    Синтаксис объекта, использующего инициализатор, таков:
    объектаИмя = {свойство1:значение1, свойство2:значение2,..., свойствоN:значениеN}

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

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

    Следующий оператор создаёт объект и присваивает его переменной x, если, и только если, выражение cond будет true:
    if (cond) x = {hi:"there"}
    Следующий пример создаёт myHonda с тремя свойствами. Обратите внимание, что свойство engine также является объектом со своими собственными свойствами.
    myHonda = {color:"red",wheels:4,engine:{cylinders:4,size:2.2}}
    Вы можете также использовать инициализаторы объектов для создания массивов. См. .


    JavaScript 1.1 и ранее.


    Вы не можете использовать инициализаторы объектов. Можно создать объекты только с помощью конструкторов функций или используя функцию, предоставляемую для этих целей каким-нибудь другим объектом. См. .



    Использование Классов LiveConnect

    Все объекты JavaScript появляются в коде Java как экземпляры netscape.javascript.JSObject. Если Вы вызываете метод в Java-коде, Вы можете передать в него JavaScript-объект как один из аргументов. Чтобы выполнить это, Вы обязаны определить соответствующий формальный параметр этого метода как имеющий тип JSObject.
    Итак, при использовании JavaScript-объектов в Java-коде Вы всегда должны помещать вызов JavaScript-объекта внутри оператора try...catch, который обрабатывает исключения типа netscape.javascript.JSException. Это даёт Вашему Java-коду возможность обрабатывать ошибки при выполнении JavaScript-кода, которые появляются в Java как исключения типа JSException.


    Использование Конструктора Функции

    Альтернативно Вы можете создать объект в два этапа:

    Определить тип объекта, написав конструктор функции.
  • Создав экземпляр объекта с помощью оператора new.


  • Чтобы определить тип объекта, создайте функцию для типа объекта, которая специфицирует его имя , свойства и методы. Например, предположим, Вы хотите создать тип объекта для автомобилей и назвать его car, и чтобы он имел свойства make, model, year и color. Для этого нужно написать такую функцию:
    function car(make, model, year) {

    this.make = make;

    this.model = model;

    this.year = year;

    }
    Обратите внимание на использование this для присвоения значений свойствам объекта на базе значений, передаваемых в эту функцию.
    Теперь можно создать объект с названием mycar:
    mycar = new car("Eagle", "Talon TSi", 1993);
    Этот оператор создаёт объект mycar и присваивает его свойствам специфицированные значения. Теперь значением свойства mycar.make является строка "Eagle", значением свойства mycar.year - целое число 1993 и так далее.
    Можно создать любое количество объектов car с помощью оператора new. Например,
    kenscar = new car("Nissan", "300ZX", 1992);

    vpgscar = new car("Mazda", "Miata", 1990);
    Объект может иметь свойство, которое само является объектом. Например, предположим, Вы определяете объект person:
    function person(name, age, sex) {

    this.name = name

    this.age = age

    this.sex = sex

    }
    и затем инстанциируете два новых объекта person:
    rand = new person("Rand McKinnon", 33, "M");

    ken = new person("Ken Jones", 39, "M");
    Затем Вы можете переписать определение car, чтобы включить свойство owner, принимаемое объектом person:
    function car(make, model, year, owner) {

    this.make = make;

    this.model = model;

    this.year = year;

    this.owner = owner


    }

    Для создания новых экземпляров Вы теперь используете:

    car1 = new car("Eagle", "Talon TSi", 1993, rand);

    car2 = new car("Nissan", "300ZX", 1992, ken);

    Заметьте, что теперь, вместо передачи литеральной строки или целочисленного значения при создании новых объектов, вышеприведённые операторы передают rand и ken как аргументы свойства owner. Теперь, чтобы определить имя владельца машины car2, Вы осуществляете доступ к свойству:

    car2.owner.name

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

    car1.color = "black"

    добавляет свойство color объекту car1 и присваивает ему значение "black." Однако это не влияет на другие объекты. Чтобы добавить новое свойство ко всем объектам того же типа, Вы должны добавить свойство в определение типа объекта car.



    Использование массива arguments

    Аргументы функции обслуживаются в массиве. Внутри функции вы можете адресовать передаваемые ей аргументы таким образом:

    arguments[i]

    где i это порядковый номер аргумента, начиная с 0. Итак, первым аргументом, передаваемым функции, будет arguments[0]. Общее количество аргументов обозначается свойством arguments.length.

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

    Например, рассмотрим функцию, объединяющую несколько строк. Единственным формальным аргументом функции является строка, специфицирующая символ-разделитель объединяемых строк. Функция определяется так:
    function myConcat(separator) {

    var result="" // initialize list

    // iterate through arguments

    for (var i=1; i
    result += arguments[i] + separator

    }

    return result

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

    // возвращает "red, orange, blue, "

    myConcat(", ","red","orange","blue")
    // возвращает "elephant; giraffe; lion; cheetah; "

    myConcat("; ","elephant","giraffe","lion", "cheetah")
    // возвращает "sage. basil. oregano. pepper. parsley. "

    myConcat(". ","sage","basil","oregano", "pepper", "parsley")
    См. объект Function в книге

    JavaScript 1.3 и предыдущие версии.

    Массив arguments является свойством объекта Function, и ему может предшествовать имя функции таким образом:

    functionName.arguments[i]




    Использование Простых Патэрнов

    Простые патэрны составляются из символов, для которых Вы ищете прямое совпадение. Например, патэрн /abc/ совпадает в строке только с точными комбинациями указанных символов 'abc' в указанном порядке. Такое совпадение произойдёт в строках "Hi, do you know your abc's?" и "The latest airplane designs evolved from slabcraft." В обоих случаях совпадение произойдёт с подстрокой 'abc'. В строке "Grab crab" совпадения не будет, поскольку она не содержит подстроки 'abc'.



    Использование Скобок

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

    Например, патэрн /Chapter (\d+)\.\d*/ иллюстрирует использование дополнительных escape-ированных и специальных символов и указывает, что эта часть патэрна должна быть запомнена. Он совпадает точно с символами 'Chapter ' с последующими одним или более цифровыми символами (\d означает любой цифровой символ, а + означает 1 или более раз), с последующей десятичной точкой (которая сама по себе является специальным символом; предварение десятичной точки символом \ означает, что патэрн обязан искать специальный литеральный символ '.'), с последующим любым цифровым символом 0 или более раз(\d означает цифровой символ, * означает 0 или более раз). Кроме того, используются скобки для запоминания первых совпавших цифровых символов.
    Этот патэрн будет найден в строке "Open Chapter 4.3, paragraph 6", и '4' будет запомнена. Патэрн не будет найден в строке "Chapter 3 and 4", поскольку здесь отсутствует десятичная точка после цифры '3'.
    Чтобы найти совпадение с подстрокой без запоминания совпавшей части, предваряйте патэрн внутри скобок символами ?:. Например, (?:\d+) совпадает с единицей или числовым символом, но не запоминает совпавшие символы.




    Использование Слова this для Ссылок на Объект

    JavaScript имеет специальное ключевое слово this, которое может использоваться внутри метода для ссылки на текущий объект. Например, если у Вас имеется функция validate, проверяющая значение свойства объекта и значения high и low:
    function validate(obj, lowval, hival) {

    if ((obj.value < lowval) (obj.value > hival))

    alert("Invalid Value!")

    }
    то Вы можете вызвать validate в обработчике события onChange любого элемента формы, используя this для передачи обработчику элемента формы, как в этом примере:

    onChange="validate(this, 18, 99)">
    В общем, this ссылается в методе на вызывающий объект.
    В сочетании со свойством формы, this может обращаться к родительской форме текущего объекта. В следующем примере форма myForm содержит Text-объект и кнопку. Если пользователь щёлкает на кнопке, значением Text-объекта становится имя формы. Обработчик нажатия кнопки onClick использует this.form для ссылки на родительскую форму, myForm.



    Form name:



    onClick="this.form.text1.value=this.form.name">





    Использование Совпадений Подстрок в Скобках

    Включение скобок в патэрн регулярного выражения вызывает запоминание соответствующего подсовпадения. Например, /a(b)c/ совпадает с символами 'abc' и запоминает 'b'. Чтобы вызвать эту подстроку в скобках, используйте Array-элементы [1], ..., [n].

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

    Пример 1.

    В этом скрипте используется метод replace для изменения-переключения слов в строке. Для замещающего текста в скрипте используется $1 и $2 для обозначения первой строки и второй подстроки в скобках.



    Будет напечатано "Smith, John".


    Пример 2.

    Здесь RegExp.input устанавливается событием Change. В функции getInfo метод exec, вызываемый с использованием сокращённой нотации (), использует значение RegExp.input в качестве аргумента.



    Enter your first name and your age, and then press Enter.










    Использование Специальных Символов для Проверки Ввода

    В этом примере пользователь вводит телефонный номер. Когда нажимается Enter, скрипт проверяет правильность ведённого номера. Если номер введён правильно (соответствует последовательности символов, специфицированной регулярным выражением), скрипт выводит окно с подтверждением и благодарностью. Если номер введён неправильно, скрипт выводит окно, информирующее пользователя, что номер введён неправильно.

    Регулярное выражение ищет 0 или более открывающих скобок \(? с последующими тремя цифрами \d{3}, с последующими 0 или более закрывающими скобками \)?, с последующим тире, слэшем или или десятичной точкой и, если найдёт, запоминает символ ([-\/\.]), последующие три цифры \d{3}, тире, слэш или десятичную точку \1, с последующими 4 цифрами\d{4}.
    Событие Change активируется, когда пользователь нажимает Enter, и устанавливает значение RegExp.input.




    Enter your phone number (with area code) and then press Enter.










    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Использование Специальных Символов

    Если при поиске требуется нечто большее, чем простое совпадение, например, найти один или более символов b или найти пробел, в патэрн включаются специальные символы. Например, патэрн /ab*c/ совпадает с любой комбинацией символов, в которой после одиночной 'a' идёт нуль или более символов 'b" (* означает 0 или более вхождений предшествующего элемента/символа) и сразу за ними - 'c'. В строке "cbbabbbbcdebc" этот патэрн совпадёт с подстрокой 'abbbbc'.

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


    Таблица 4.1 Специальные символы в Регулярных Выражениях



    Символ

    Значение
    \

    Одно из следующих:

  • Для символов, которые обычно рассматриваются литерально, означает, что следующий символ является специальным и не должен интерпретироваться литерально.
    Например, /b/ совпадает с символом 'b'. Поместив backslash перед b, то есть так: /\b/, мы делаем символ специальным, в данном случае - означающим границу слова.

  • Для символов, которые обычно рассматриваются специально, означает, что следующий символ является литеральным и не должен интерпретироваться как специальный.
    Например, * это специальный символ, означающий 0 или более вхождений предыдущего символа; например, /a*/ означает 0 или более 'a'. Чтобы подставит * литерально, ставим перед ним backslash; например, /a\*/ совпадает с 'a*'.
  • ^ Соответствует началу ввода. Если многострочный флаг установлен в true, совпадает также сразу после символа разрыва строки.
    Например, /^A/ не совпадает с 'A' в строке "an A", но совпадает с первым 'A' в строке "An A". $ Совпадает с концом ввода. Если многострочный флаг установлен в true, совпадает также непосредственно перед символом разрыва строки.
    Например, /t$/ не совпадает с 't' в строке "eater", но совпадает с в строке "eat".
    * Предшествующий символ совпадает 0 или более раз.
    Например, /bo*/ совпадает с 'boooo' в строке "A ghost booooed" и с 'b' в "A bird warbled", но не совпадает ни с чем в строке "A goat grunted".

    + Предшествующий символ совпадает 1 или более раз. Эквивалентно {1,}.

    Например, /a+/ совпадает с 'a' в "candy" и со всеми 'a' в "caaaaaaandy".

    ?Предшествующий символ совпадает 0 или 1 раз.

    Например, /e?le?/ совпадает с 'el' в "angel" и с 'le' в "angle."

    Если используется сразу после квантификаторов *, +, ? или {}, делает квантификатор нежадным (совпадает минимальное число раз), что противоположно действию по умолчанию, когда квантификатор - жадный (совпадает максимальное число раз).

    Используется также во вперёдсмотрящих/lookahead утверждениях, описанных в пунктах о x(?=y) и x(?!y) в этой таблице.

    . (Десятичная точка) совпадает с любым одиночным символом, исключая символ новой строки.

    Например, /.n/ совпадает с 'an' и с 'on' в "nay, an apple is on the tree", но не с 'nay'.(x) Совпадает с 'x' и запоминает совпадение. Это называется "захватывающие скобки".

    Например, /(foo)/ совпадает с 'foo', и запоминает её, в "foo bar." Совпадающая подстрока может быть вызвана из элементов результирующего массива [1], ..., [n]. (?:x) Совпадает с 'x', но не запоминает совпадение. Это называется "незахватывающие скобки". Совпадающая подстрока не может быть вызвана из элементов результирующего массива [1], ..., [n].

    x(?=y) Совпадает с 'x' только в том случае, если после 'x' следует 'y'. Например, /Jack(?=Sprat)/ совпадает с 'Jack' только тогда, когда следом идёт 'Sprat'. /Jack(?=Sprat|Frost)/ совпадает с 'Jack' только тогда, когда следом идёт 'Sprat' или 'Frost'. Однако ни 'Sprat', ни 'Frost' не являются частью результата совпадения.

    x(?!y) Совпадает с 'x' только в том случае, если после 'x' не следует 'y'. Например, /\d+(?!\.)/ совпадает с числом только в том, случае, если после него нет десятичной точки. регулярное выражение /\d+(?!\.)/.exec("3.141") совпадает с 141, но не совпадает с 3.141.

    x|yСовпадает с 'x' или 'y'.

    Например, /green|red/ совпадает с 'green' в "green apple" и с 'red' в "red apple."


    {n} Где n это положительное целое. Совпадает с точно n-количеством вхождений предшествующего символа.

    Например, /a{2}/ не совпадает с 'a' в "candy," но совпадает со всеми 'a' в "caandy" и с первыми двумя 'a's в "caaandy."

    {n,}Где n это положительное целое. Совпадает с как минимум n вхождений предшествующего символа.

    Например, /a{2,} не совпадает с 'a' в "candy", но совпадает со всеми 'a' в "caandy" и в "caaaaaaandy."{n,m} Где n и m это положительные целые. Совпадает с минимум n и с максимум m вхождений предшествующего символа.

    Например, /a{1,3}/ не совпадает ни с чем в "cndy", совпадает с 'a' в "candy", с первыми двумя 'a' в "caandy" и с первыми тремя 'a' в "caaaaaaandy" Заметьте, что при совпадении с "caaaaaaandy", совпадёт "aaa", хотя оригинальная строка содержит большее количество 'a'.

    [xyz] Набор символов. Совпадение с одним из символов в скобках. Можно специфицировать диапазон символов с помощью дефиса.

    Например, [abcd] это то же самое, что и [a-d]. Совпадает с 'b' в "brisket" и с 'c' в "ache". [^xyz] Отрицание предложенного набора символов. То есть совпадает со всем, кроме того, что заключено в скобки. Можно специфицировать диапазон символов с помощью дефиса.

    Например, [^abc] это то же самое, что [^a-c]. Они совпадают с 'r' в "brisket" и с 'h' в "chop." [\b] Совпадает с backspace (не путайте с \b).

    \b Совпадает на границе слова с таким символом, как space и символ новой строки (не путайте с[\b]).

    Например, /\bn\w/ совпадает с 'no' в "noonday"; /\wy\b/ совпадает с 'ly' в "possibly yesterday."

    \B Совпадает не на границе слова.

    Например, /\w\Bn/ совпадает с 'on' в "noonday", а /y\B\w/ совпадает с 'ye' в "possibly yesterday."

    \cX Где X это управляющий символ. Совпадает с управляющим символом.

    Например, /\cM/ совпадает с control-M в строке.


    \d Совпадает с цифровым символом. Эквивалентно [0-9].

    Например, /\d/ или /[0-9]/ совпадает с '2' в "B2 is the suite number."

    \D Совпадает с любым нецифровым символом. Эквивалентно [^0-9].

    Например, /\D/ или /[^0-9]/ совпадает с 'B' в "B2 is the suite number."

    \f Совпадает с символом прогона страницы/form-feed.

    \n Совпадает с символом прогона строки/linefeed.

    \r Совпадает с символом возврата каретки/carriage return.

    \s Совпадает с одиночным пробельным символом, включая space, tab, form feed, line feed. Эквивалентно [ \f\n\r\t\v\u00A0\u2028\u2029].

    Например, /\s\w*/ совпадает с ' bar' в "foo bar."

    \S Совпадает с одиночным символом, отличным от пробельного символа. Эквивалентно
    [ ^\f\n\r\t\v\u00A0\u2028\u2029].

    Например, /\S\w*/ совпадает с 'foo' в "foo bar."

    \t Совпадает с табуляцией/tab.\v Совпадает с вертикальной табуляцией/vertical tab.

    \w Совпадает с любым алфавитным символом, включая символ подчёркивания/underscore. Эквивалентно [A-Za-z0-9_].

    Например, /\w/ совпадает с 'a' в "apple," с '5' в "$5.28" и с '3' в "3D."

    \W Совпадает с любым несловарным символом. Эквивалентно [^A-Za-z0-9_].

    Например, /\W/ или /[^$A-Za-z0-9_]/ совпадает с '%' в "50%."

    \n Где n это положительное целое. Обратная ссылка на последнюю подстроку, совпавшую с n вхождений символа в скобках в регулярном выражении (включая левые скобки). (Здесь не совсем чётко ... Прим. перев.)

    Например, /apple(,)\sorange\1/ совпадает с 'apple, orange,' в "apple, orange, cherry, peach." \0 Совпадает с символом NUL. Не вводите после него других цифр.

    \xhh Совпадает с символом с 16-ричным кодом hh (две 16-ричные цифры)

    \uhhhh Совпадает с символом с 16-ричным кодом hhhh (четыре 16-ричные цифры).



    Изменение Порядка в Строке Ввода

    В этом примере показано форматирование регулярного выражения и использование методов string.split() и string.replace(). Очищается необработанная строка ввода, содержащая имена (сначала имя, потом фамилия), разделённые пробелами, табуляцией и одиночным символом "точка с запятой". Наконец, имена и фамилии меняются местами (сначала - фамилия) и список сортируется.





    JavaScript и Java

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

    В отличие от системы времени компиляции классов Java, построенной на объявлениях, JavaScript поддерживает систему времени выполнения на базе небольшого количества типов данных: числовых, Булевых и строковых значений. JavaScript имеет объектную модель на базе прототипов, а не на более привычной базе классов. Модель на базе прототипов предоставляет динамическое наследование; то есть то, что наследуется, может отличаться для каждого конкретного объекта. JavaScript также поддерживает функции без каких-либо требований к их объявлению. Функции могут быть свойствами объекта, выполняя свободно типизированные методы.
    JavaScript является очень свободным языком по сравнению с Java. Вы не должны объявлять все переменные, классы и методы. Вы не должны заботиться о том, какие методы являются public, private или protected, и не должны реализовывать интерфейсы. Значения, возвращаемые переменными, параметрами и функциями, не типизированные явно.
    Java является языком программирования на базе классов, разработанным для быстрого выполнения и безопасности типов. Безопасность типов означает, к примеру, что Вы не можете привести Java integer к ссылке на объект или получить доступ к private-памяти, нарушив байтовый код Java. Модель Java на базе классов означает, что программы состоят исключительно из классов и их методов. Наследование классов Java и строгая типизация в целом требуют тесно связанной иерархии объектов. Эти требования делают язык Java более сложным, чем JavaScript.
    В противоположность этому, JavaScript по духу и сути ведёт своё происхождение от линии компактных, динамически типизируемых языков, таких как HyperTalk и dBASE. Эти языки скриптинга предоставляют утилиты программирования для более широкой аудитории, поскольку имеют упрощённый синтаксис, специализированную встроенную функциональность и минимальные требования при создании объектов.

    Таблица 1.1 JavaScript в Сравнении с Java


    JavaScript
    Java
    Объектно-ориентированный. Нет различий между типами объектов. Наследование осуществляется через механизм прототипов, и свойства и методы могут добавляться к объекту динамически.

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

    Дополнительную информацию об различиях между JavaScript и Java см. в .



    JavaScript и Спецификация ECMA

    Netscape изобрела JavaScript, и JavaScript был впервые использован в браузерах фирмы Netscape. Но Netscape работает совместно с (European Computer Manufacturers Association/Европейская Ассоциация Производителей Компьютеров) для создания стандартизованного международного языка программирования на базе ядра JavaScript. ECMA является ассоциацией международных стандартов в области информации и систем коммуникации. Стандартизованная версия JavaScript, называемая ECMAScript, ведёт себя совершенно одинаково во всех приложениях, поддерживающих этот стандарт. Компании могут использовать этот открытый стандартный язык для разработки своих реализаций JavaScript. Первая версия стандарта ECMA задокументирована в спецификации ECMA-262.
    Стандарт ECMA-262 также одобрен (International Organization for Standards) как ISO-16262. Вы можете найти на web-сайте Mozilla. Вы можете также найти эту . DOM определяет способ, которым объекты HTML-документа экспонируются в Вашем скрипте.




    JavaScript и Терминология ECMA

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

    В документации JavaScript описаны аспекты языка, которые нужны программисту на JavaScript. Например:

  • Объект global не обсуждается в документации по JavaScript, поскольку Вы не используете его явно. Методы и свойства объекта global обсуждаются в документации по JavaScript, но называются функциями и свойствами верхнего уровня.

  • Конструктор без параметров (нулевой аргумент) с объектами Number и String не обсуждается в документации JavaScript, поскольку то, что генерируется, используется мало. Конструктор объекта Number без аргумента возвращает +0, а конструктор объекта String без аргумента возвращает "" (пустую строку).



  • Языки на Базе Классов и Языки на Базе Прототипов

    Объектно-ориентированные языки на базе классов, такие как Java и C++, основаны на концепции двух различных сущностей: классов и экземпляров.

  • Класс определяет все свойства (если рассматривать методы и поля Java или члены C++ как свойства), которые характеризуют определённый набор объектов. Класс это абстракция, а не какой-то определённый член набора объектов, которые он описывает. Например, класс Employee может представлять набор всех служащих/employees.
  • Экземпляр, с другой стороны, это инстанциация класса; то есть один из его членов. Например, Victoria может быть экземпляром класса Employee, представляя отдельного индивидуума как служащего/employee. Экземпляр имеет в точности те свойства, которые имеет его родительский класс (ни больше, ни меньше).

  • Язык на базе прототипов, такой как JavaScript, не имеет таких различий: в нем просто имеются объекты. Язык на базе прототипов содержит понятие prototypical object\прототипичный объект - объект, используемый как шаблон, из которого получаются начальные свойства для нового объекта. Любой объект может специфицировать свои собственные свойства, либо когда Вы создаёте его, либо на этапе прогона. Кроме того, любой объект может быть ассоциирован как прототип для другого объекта, давая другому объекту возможность использовать свойства первого объекта.



    Комментарии обычно

    Комментарии обычно разъясняют действия, выполняемые кодом. Комментарии игнорируются интерпретатором. JavaScript поддерживает комментарии в стиле Java и C++:

  • Однострочный комментарий с двойным слэшем в начале строки (//).
  • Многострочный комментарий с символами /* в начале и с символами */ в конце.


  • Пример.

    Вот пример двух комментариев:
    // Это однострочный комментарий.
    /* А это - многострочный. Он может быть любой длины, и Вы можете

    поместить сюда всё, что угодно. */



    Константы

    Вы можете создавать именованные константы "только-для-чтения" с помощью ключевого слова const. Синтаксис идентификатора константы такой же, что и у идентификатора переменной: он обязан начинаться с буквы или символа подчёркивания и может содержать символы алфавита, числа и символ подчёркивания.

    const prefix = '212';

    Константа не может изменить значение путём нового присвоения и не может быть переобъявлена в процессе выполнения скрипта.

    Правила видимости для констант те же, что и для переменных, за исключением того, что ключевое слово const необходимо всегда, даже для глобальных констант. Если ключевое слово отсутствует, идентификатор представляет var.
    Вы не можете объявить константу с тем же именем, что и у функции или переменной, в одной области видимости с этой функцией или переменной. Например:

    //ЭТО ВЫЗОВЕТ ОШИБКУ

    function f{};

    const f = 5;
    //ЭТО ТАКЖЕ ВЫЗОВЕТ ОШИБКУ

    function f{

    const g=5;

    var g;
    //операторы
    }

    Конверсия Типов Данных

    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

    Конвертация из Java в JavaScript

    Значения, передаваемые из Java в JavaScript, конвертируются так:

    Java-значения byte, char, short, int, long, float и double конвертируются в числа JavaScript.
    Булево значение Java конвертируется в булево значение JavaScript.
    Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
    Массивы Java конвертируются в объект псевдо-Array JavaScript; поведение этого объекта похоже на объект Array из JavaScript: Вы можете получить к нему доступ через синтаксис arrayName[index] (где index это целое число) и определить его размер через свойство arrayName.length.
    Java-объект любого иного класса конвертируется в оболочку JavaScript, которая может использоваться для доступа к методам и полям Java-объекта:


    Конвертация этой оболочки в строку вызывает метод toString объекта-оригинала.
    Конвертация в число вызывает метод doubleValue, если это возможно, иначе - терпит неудачу.
    Конвертация в boolean в JavaScript 1.3 и более поздних версиях возвращает false, если объект - null, и true - в ином случае.
    Конвертация в boolean в JavaScript 1.2 и более ранних версиях вызывает метод booleanValue, если это возможно, иначе - терпит неудачу.
    Заметьте, что экземпляры объектов java.lang.Double и java.lang.Integer конвертируются в объекты JavaScript, а не в числа JavaScript. Аналогично и экземпляры java.lang.String также конвертируются в объекты JavaScript, а не в строки JavaScript.

    Java String-объекты также соответствуют JavaScript-оболочкам. Если Вы вызываете метод JavaScript, который требует строки JavaScript, и передаёте его этой оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в строку JavaScript путём присоединения к ней пустой строки, как показано здесь:
    var JavaString = JavaObj.methodThatReturnsAString();

    var JavaScriptString = JavaString + "";




    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Конвертация JavaScript в Java

    Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, типы данных передаваемых параметров конвертируются в соответствии с правилами, описанными в следующих разделах:


  • return-значения методов объекта netscape.javascript.JSObject всегда конвертируются в экземпляры объекта java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.
    Например, если JSObject.eval возвращает JavaScript-число, Вы можете найти правила конвертации этого числа в экземпляр объекта java.lang.Object в разделе .


    Конвертация Типов Данных

    Поскольку язык Java строго типизирован, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. Эта конвертация описана в разделах:




    Литералы Массива

    Литерал массива это заключённый в квадратные скобки ([]) список из нуль или более выражений, каждое из которых представляет элемент массива. Если Вы создаёте массив с использованием литерала массива, этот массив инициализируется специфицированными значениями в качестве элементов, и его размер равен количеству специфицированных аргументов.

    В следующем примере создаётся массив coffees из трёх элементов размером "три":

    coffees = ["French Roast", "Columbian", "Kona"]


    Примечание

    Литерал массива это тип инициализатора объекта. См. .

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

    Литералы массива являются также 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', , ];



    Литералы Объектов

    Литерал объекта это заключённый в фигурные скобки ({}) список из 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

    Вы можете использовать числовой или строковой литерал для именования свойства или вложения одного объекта в другой. Следующий пример использует эти опции:

    car = {manyCars: {a: "Saab", b: "Jeep"}, 7: "Mazda"}
    document.write(car.manyCars.b); // Jeep

    document.write(car[7]); // Mazda



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

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

  • 10-ричного целого числа
  • Десятичной точки (".")
  • Дробной части (другого 10-ричного числа)
  • Экспоненты

  • Экспонентная часть это "e" или "E" и последующее целое число, которое может иметь знак ("+" или "-"). Литерал с плавающей точкой обязан иметь как минимум одну цифру и десятичную точку или "e" (или "E").

    Примеры литералов с плавающей точкой: 3.1415, -3.1E12, .1e12, 2E-12.

    Литералы

    Для представления значения в JavaScript можно использовать литералы. Они являются фиксированными значениями, не переменными, которые Вы
    литерально\буквально предоставляете в Вашем скрипте.

    В этом разделе описаны следующие типы литералов:





  • Логические Операции

    Логические операции обычно используются с Boolean (булевыми/логическими) значениями; в этом случае возвращается Boolean-значение. Однако операции && и реально возвращают значение одного из специфицированных операндов, поэтому, если эти операции используются с не-Boolean-значениями, они могут вернуть не-Boolean значение. Логические операции описаны в следующей таблице.


    Таблица 3.6 Логические Операции



    Операция
    ИспользованиеОписание

    &&expr1 && expr2 (Логическое И) Возвращает expr1, если оно может быть конвертировано в false; иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, && возвращает true, если оба операнда true; иначе возвращает false. expr1 expr2 (Логическое ИЛИ) Возвращает expr1, если оно может быть конвертировано в true; иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, возвращает true, если хотя бы один из операндов true; если оба операнда false, возвращает false.
    !!expr (Логическое НЕ) Возвращает false если её единственный операнд может быть конвертирован в true; иначе возвращает true.
    Примерами выражений, которые могут быть конвертированы в false являются такие выражения, которые вычисляются в null, 0, пустую строку ("") или undefined.

    Вот примеры операции && (логическое И):

    a1=true && true // t && t возвращает true
    a2=true && false // t && f возвращает false
    a3=false && true // f && t возвращает false
    a4=false && (3 == 4) // f && f возвращает false

    a5="Cat" && "Dog" // t && t возвращает Dog

    a6=false && "Cat" // f && t возвращает false

    a7="Cat" && false // t && f возвращает false

    Примеры операции (логическое ИЛИ):


    o1= true true // t t возвращает true

    o2=false true // f t возвращает true

    o3=true false // t f возвращает true

    o4=false (3 == 4) // f f возвращает false

    o5="Cat" "Dog" // t t возвращает Cat

    o6=false "Cat" // f t возвращает Cat

    o7="Cat" false // t f возвращает Cat

    Примеры операции ! (логическое НЕ):

    n1=!true // !t возвращает false

    n2=!false // !f возвращает true

    n3=!"Cat" // !t возвращает false



    Локальные и Наследуемые Значения

    Когда Вы осуществляете доступ к свойству объекта, JavaScript выполняет следующие шаги, как уже было описано в этой главе ранее:

  • Проверяет, существует ли значение локально. Если так, возвращается это значение.
  • Если локального значения нет, проверяет цепочку прототипов (используя свойство __proto__).
  • Если объект в цепочке прототипов имеет значение для специфицированного свойства, возвращается это значение.
  • Если такое свойство не найдено, объект не имеет этого свойства.

  • Результат выполнения этих шагов зависит от того, как Вы выполняете определения. Оригинал примера имел такие определения:
    function Employee () {

    this.name = "";

    this.dept = "general";

    }
    function WorkerBee () {

    this.projects = [];

    }

    WorkerBee.prototype = new Employee;
    Имея эти определения, создадим amy как экземпляр объекта WorkerBee следующим оператором:

    amy = new WorkerBee;
    Объект amy имеет одно локальное свойство, projects. Значения свойств name и dept не являются локальными для amy и поэтому получены из свойства __proto__ объекта amy. Таким образом, amy имеет следующие значения свойств:
    amy.name == "";

    amy.dept = "general";

    amy.projects == [];
    Теперь предположим, что Вы изменили значение свойства name в прототипе, ассоциированном с Employee:
    Employee.prototype.name = "Unknown"
    На первый взгляд, можно ожидать, что новое значение будет распространено на все экземпляры Employee, однако это не так.
    Если Вы создаёте любой экземпляр объекта Employee, этот экземпляр получает локальное значение свойства name (пустую строку). Это означает, что, если Вы устанавливаете прототип WorkerBee через создание нового Employee-объекта, WorkerBee.prototype имеет локальное значение для свойства name. Следовательно, когда JavaScript видит свойство name объекта amy (экземпляра WorkerBee), JavaScript находит локальное значение этого свойства в WorkerBee.prototype. Он, следовательно, не просматривает далее цепь Employee.prototype.
    Если Вы хотите изменить значение свойства объекта на этапе прогона программы и имеете новое значение, наследуемое всеми потомками объекта, Вы не можете определить это свойство в конструкторе функции объекта. Вместо этого Вы добавляете его к ассоциированному с конструктором прототипу. Например, предположим, Вы изменяете предыдущий код таким образом:
    function Employee () {

    this.dept = "general";

    }

    Employee.prototype.name = "";
    function WorkerBee () {

    this.projects = [];

    }

    WorkerBee.prototype = new Employee;
    amy = new WorkerBee;
    Employee.prototype.name = "Unknown";
    В этом случае свойство name объекта amy стало "Unknown".
    Как показывают все эти примеры, если Вы хотите иметь значения по умолчанию для свойств объекта и иметь возможность изменять эти значения по умолчанию на этапе прогона программы, Вы должны установить свойства прототипа конструктора, а не сам конструктор функции.



    Написание Патэрна Регулярного Выражения

    Патэрн регулярного выражения состоит из обычных символов, таких как /abc/, или из комбинаций обычных и специальных символов, таких как /ab*c/ или /Chapter (\d+)\.\d*/. В последнем примере есть скобки, которые используются в качестве запоминающего устройства. Совпадение этой части патэрна запоминается для последующего использования, как описано в разделе .




    Наследование Свойств

    Предположим, Вы создаёте объект mark как экземпляр объекта WorkerBee, как показано на , следующим оператором:

    mark = new WorkerBee;
    Когда JavaScript встречает оператор new, он создаёт новый общий родовой/generic объект и передаёт этот новый объект как значение ключевого слова this в конструктор функции WorkerBee. Конструктор функции явно устанавливает значение свойства projects. Он также устанавливает значение внутреннего свойства __proto__ в значение WorkerBee.prototype. (Имя этого свойства содержит два символа подчёркивания в начале и два - в конце.)

    __proto__ определяет цепь прототипов, используемую для возвращения значений свойств. После того как эти свойства установлены, JavaScript возвращает новый объект, и оператор присвоения устанавливает переменную mark в этот объект.
    Этот процесс не помещает явно значения в объект mark (локальные значения) для свойств, которые mark наследует от цепи прототипов. Когда Вы запрашиваете значение свойства, JavaScript сначала проверяет, существует ли значение в этом объекте. Если существует, это значение возвращается. Если локального значения нет, JavaScript проверяет цепь прототипов (используя свойство __proto__). Если объект в цепи прототипов имеет значение для этого свойства, это значение возвращается. Если такое свойство не найдено, JavaScript сообщает, что объект не имеет этого свойства. Таким образом, объект mark имеет следующие свойства и значения:
    mark.name = "";

    mark.dept = "general";

    mark.projects = [];
    Объект mark наследует значения свойств name и dept из прототипичного объекта в mark.__proto__. Оно присваивается локальному значению свойства projects конструктором WorkerBee. Это даёт Вам наследование свойств и их значений в JavaScript. Некоторые тонкости этого процесса обсуждаются в разделе .
    Поскольку эти конструкторы не позволяют вводить значения, специфичные для экземпляра, эта информация является общей. Значения свойств являются значениями по умолчанию, используемыми всеми новыми объектами, создаваемыми на основе WorkerBee. Вы можете, разумеется, изменять значение любого из этих свойств. Так, Вы можете ввести в mark специфическую информацию:
    mark.name = "Doe, Mark";

    mark.dept = "admin";

    mark.projects = ["navigator"];



    Нет Множественного Наследования

    Некоторые объектно-ориентированные языки разрешают множественное наследование. То есть, объект может наследовать свойства и значения из не связанных между собой родительских объектов. JavaScript не поддерживает множественное наследование.

    Наследование значений свойств возникает на этапе прогона программы, когда JavaScript ищет значение по цепочке прототипов объекта. Поскольку объект имеет единственный ассоциированный прототип, JavaScript не может динамически наследовать из более чем одной цепочки прототипов.
    В JavaScript Вы можете иметь несколько вызовов одного конструктора функции внутри другого. Это создаёт иллюзию множественного наследования. Например, рассмотрим следующие операторы:
    function Hobbyist (hobby) {

    this.hobby = hobby "scuba";

    }
    function Engineer (name, projs, mach, hobby) {

    this.base1 = WorkerBee;

    this.base1(name, "engineering", projs);

    this.base2 = Hobbyist;

    this.base2(hobby);

    this.machine = mach "";

    }

    Engineer.prototype = new WorkerBee;
    dennis = new Engineer("Doe, Dennis", ["collabra"], "hugo")
    Далее предположим, что имеется определение WorkerBee, такое как ранее в этой главе. В этом случае объект dennis имеет три свойства:
    dennis.name == "Doe, Dennis"

    dennis.dept == "engineering"

    dennis.projects == ["collabra"]

    dennis.machine == "hugo"

    dennis.hobby == "scuba"
    Итак, dennis получает свойство hobby от конструктора Hobbyist. Однако предположим, что Вы затем добавляете свойство в прототип конструктора Hobbyist:
    Hobbyist.prototype.equipment = ["mask", "fins", "regulator", "bcd"]
    Объект dennis не наследует это новое свойство.



    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    New

    Вы можете использовать операцию new для создания экземпляра объекта пользовательского типа или экземпляра одного из предопределённых типов объекта: Array, Boolean, Date, Function, Image, Number, Object, Option, RegExp или String. На сервере Вы можете также использовать её с DbPool, Lock, File или SendMail. Используйте new так:

    objectName = new objectType ( param1 [,param2] ...[,paramN] )

    Вы можете также создать объекты, используя инициализаторы объектов, как описано в .

    См. new в книге

    Новые Возможности Этой Версии

    Резюме по нововведениям JavaScript версии 1.5 см. в разделе .

    Информация об этих возможностях содержится в статьях данного учебника.



    Новые Возможности в Этой Версии

    JavaScript версии 1.5 содержит следующие новые возможности и улучшения:

  • Ошибки времени выполнения. О них теперь сообщается как об исключениях.
  • Улучшение форматирования чисел. Включены методы Number.prototype.toExponential, Number.protoytpe.toFixed и Number.prototype.toPrecision.
  • Добавлены следующие улучшения в регулярных выражениях:

  • Квантификаторы +, *, ? и {} могут иметь теперь после себя ? для форсирования их в нежадные. .
  • Незахватывающие скобки, (?:x) могут использоваться вместо захватывающих скобок (x). Если используются незахватывающие скобки, совпадающие подвыражения недоступны как обратные ссылки. .
  • Положительные и отрицательные "смотрящие вперёд утверждения" поддерживаются. И те, и другие подтверждают совпадение, в зависимости от того, что идёт после совпавшей подстроки. .
  • Флаг m был добавлен, чтобы дать возможность специфицировать, что регулярное выражение должно совпадать на нескольких строках


  • Объявление условной функции. Функции могут теперь объявляться внутри if.

  • Функции выражения. Функции могут теперь объявляться внутри выражения.

  • Несколько переходов catch поддерживаются теперь внутри оператора try...catch.

  • Getter'ы и Setter'ы. Теперь в JavaScript можно добавлять их к объектам. Эта возможность имеется только в C-реализации JavaScript.

  • Константы. Теперь поддерживаются именованные константы "только для чтения". Эта возможность имеется только в C-реализации JavaScript.



  • Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Null-Значения

    Если Вы передаёте значения null JavaScript в качестве параметра Java-методам, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    Любой класс
    Любой тип интерфейса
    Значение становится null.
    byte
    char
    double
    float
    int
    long
    short
    Значение становится 0.
    boolean
    Значение становится false.


    Объект Array

    В JavaScript нет отдельного типа для массива данных. Однако Вы можете использовать предопределённый объект Array и его методы для работы с массивами в Ваших приложениях. Объект Array имеет методы для манипулирования массивами: объединения, разворачивания и сортировки. Он имеет также свойство для определения размера массива и другие свойства для использования с регулярными выражениями.
    Массив это упорядоченный набор значений, к которым можно обращаться по имени и по индексу. Например, Вы имеете массив emp, содержащий имена служащих, индексированный по именам служащих. Так, emp[1] это служащий номер 1, emp[2] - служащий номер 2 и так далее.
    Создание Массива


    Чтобы создать Array-объект:
    1. arrayObjectName = new Array(element0, element1, ..., elementN)

    2. arrayObjectName = new Array(arrayLength)

    arrayObjectName это имя нового объекта, либо свойство существующего объекта. При использовании Array-свойств и методов, arrayObjectName это либо имя существующего Array-объекта, либо свойство существующего объекта.
    element0, element1, ..., elementN это список значений элементов массива. Когда специфицирована эта форма, массив инициализируется специфицированными значениями в качестве элементов массива, а свойство length массива устанавливается в количество аргументов.
    arrayLength это начальный размер массива. Следующий код создаёт массив из 5 элементов:
    billingMethod = new Array(5)
    Литералы массива также являются Array-объектами; например, нижеследующий литерал является Array-объектом. См. .
    coffees = ["French Roast", "Columbian", "Kona"]
    Наполнение Массива


    Вы можете заполнить массив путём присвоения значений его элементам. Например,
    emp[1] = "Casey Jones"

    emp[2] = "Phil Lesh"

    emp[3] = "August West"

    Вы можете также заполнить массив при его создании:
    myArray = new Array("Hello", myVar, 3.14159)
    Обращение к Элементам Массива


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

    myArray = new Array("Wind","Rain","Fire")

    Затем Вы обращаетесь к первому элементу массива myArray[0], а ко второму элементу - myArray[1].

    Индексы элементов начинаются с нуля (0), но размер массива (например, myArray.length) отражает точное количество элементов в массиве.

    Array-Методы


    Array-объект имеет следующие методы:


  • concat объединяет два массива и возвращает новый массив;

  • join объединяет все элементы массива в строку;

  • pop удаляет последний элемент массива и возвращает этот элемент;

  • push добавляет один или более элементов в конец массива и возвращает эти последние добавленные элементы;

  • reverse разворачивает элементы массива: первый элемент становится последним, а последний - первым;

  • shift удаляет первый элемент массива и и возвращает этот элемент;

  • slice извлекает часть массива и возвращает новый массив;

  • splice добавляет и/или удаляет элементы из массива;

  • sort сортирует элементы массива;

  • unshift добавляет один или более элементов в начало массива и возвращает новый размер массива.


  • Например, Вы определили следующий массив:

    myArray = new Array("Wind","Rain","Fire")

    myArray.join() возвращает "Wind,Rain,Fire";

    myArray.reverse переворачивает массив так, что myArray[0] будет "Fire", myArray[1] - "Rain", а myArray[2] - "Wind".

    myArray.sort сортирует массив так, что myArray[0] будет "Fire", myArray[1] - "Rain", в myArray[2] - "Wind".

    Двухмерные Массивы


    Следующий код создаёт двухмерный массив:

    a = new Array(4)

    for (i=0; i < 4; i++) {

    a[i] = new Array(4)

    for (j=0; j < 4; j++) {

    a[i][j] = "["+i+","+j+"]"

    }
    }

    Создаётся массив, состоящий из следующих рядов/rows:

    Row 0:[0,0][0,1][0,2][0,3]

    Row 1:[1,0][1,1][1,2][1,3]

    Row 2:[2,0][2,1][2,2][2,3]

    Row 3:[3,0][3,1][3,2][3,3]



    Массивы и Регулярные Выражения


    Ели массив является результатом совпадения регулярного выражения и строки, этот массив возвращает свойства и элементы, предоставляющие информацию о совпадении. Массив является return-значением методов RegExp.exec, String.match и String.split. Об использовании массивов с регулярными выражениями см. .



    Объект Boolean

    Объект Boolean является оболочкой вокруг примитивного типа данных Boolean. Для создания Boolean-объекта используйте следующий синтаксис:

    booleanObjectName = new Boolean(value)
    Не путайте примитивные Boolean-значения true и false со значениями true и false Boolean-объекта. Любой объект, значение которого не undefined , null, 0, NaN или не пустая строка, включая Boolean-объект со значением false, вычисляется в true при передаче условному оператору. См. .



    Объект Date

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

    JavaScript обрабатывает даты аналогично Java. Эти два языка имеют много аналогичных date-методов и оба хранят даты как количество миллисекунд, прошедших после 1 января 1970 года, 00:00:00.
    Объект Date имеет диапазон значений от -100,000,000 до 100,000,000 дней в обе стороны от 01 января 1970 года UTC (Всемирного Времени).
    Для создания Date-объекта:
    dateObjectName = new Date([parameters])
    где dateObjectName это имя создаваемого Date-объекта; это может быть новый объект или свойство существующего объекта.
    Параметры/parameters в этом синтаксисе могут быть:

  • пустыми: вводятся текущие время и дата. Например, today = new Date();

  • строкой, представляющей дату в следующем формате: "месяц день, год час:минуты:секунды." Например, Xmas95 = new Date("December 25, 1995 13:30:00"). Если Вы пропустите часы, минуты или секунды, значение будет установлено в нуль.

  • набором целочисленных значений для года, месяца и дня. Например, Xmas95 = new Date(1995,11,25). Набором значений для года, месяца, дня, часов, минут и секунд. Например, Xmas95 = new Date(1995,11,25,9,30,0).


  • JavaScript 1.2 и ранее.

    Объект Date ведёт себя так:

  • Даты до 1970 не допускаются.
  • JavaScript зависит от специфики поведения даты на конкретной платформе; поведение Date-объекта варьируется от платформы к платформе.



  • Методы Объекта Date


    Методы объекта Date для работы с датами и временем подразделяются на следующие категории:

  • "set" методы для установки значений даты времени в Date-объектах;
  • "get" методы для получения значений даты времени из Date-объектов;
  • "to" методы для возвращения строковых значений из Date-объектов;
  • методы parse и UTC для разбора Date-строк.

  • С помощью методов "get" и "set" Вы можете по отдельности получать и устанавливать значения секунд, минут, часа, дня месяца, дня недели, месяца и года. Имеется метод getDay, возвращающий день недели, но отсутствует парный метод setDay, поскольку день недели устанавливается автоматически. Эти методы используют целые числа для представления своих значений:


  • Секунд и минут: от 0 до 59

  • Часа: от 0 до 23

  • Дня недели: от 0 (воскресенье) до 6 (суббота)

  • Даты: от 1 до 31 (день месяца)

  • Месяца: от 0 (январь) до 11 (декабрь)

  • Года: годы после 1900


  • Например, Вы определили следующую дату:

    Xmas95 = new Date("December 25, 1995")

    Тогда Xmas95.getMonth() возвратит 11, а Xmas95.getFullYear() возвратит 1995.

    Методы getTime и setTime используются при сравнении дат. Метод getTime возвращает количество миллисекунд, прошедших после 1 января 1970 года, 00:00:00, для Date-объекта.

    Например, следующий код выводит количество дней, оставшихся до конца текущего года:

    today = new Date()

    endYear = new Date(1995,11,31,23,59,59,999) // Устанавливает день и месяц

    endYear.setFullYear(today.getFullYear()) // Устанавливает год в текущее значение

    msPerDay = 24 * 60 * 60 * 1000 // Количество миллисекунд в день

    daysLeft = (endYear.getTime() - today.getTime()) / msPerDay

    daysLeft = Math.round(daysLeft) //возвращает количество оставшихся в этом году дней

    Этот пример создаёт Date-объект по имени today, содержащий текущую дату. Затем создаётся Date-объект endYear и в него устанавливается текущее значение года. Затем, путём использования количества миллисекунд в день, вычисляется количество дней от сегодняшнего числа до до endYear через использование метода getTime и оно округляется до целого количества дней.

    Метод parse применяется для присвоения значений date-строк существующим Date-объектам. Например, следующий код использует методы parse и setTime для присвоения значения даты объекту IPOdate:

    IPOdate = new Date()

    IPOdate.setTime(Date.parse("Aug 9, 1995"))

    Использование Объекта Date: Пример


    В этом примере функция JSClock() возвращает время в формате электронного циферблата:

    function JSClock() {

    var time = new Date()

    var hour = time.getHours()

    var minute = time.getMinutes()

    var second = time.getSeconds()

    var temp = "" + ((hour > 12) ? hour - 12 : hour)


    if (hour == 0)

    temp = "12";

    temp += ((minute < 10) ? ":0" : ":") + minute

    temp += ((second < 10) ? ":0" : ":") + second

    temp += (hour >= 12) ? " P.M." : " A.M."

    return temp

    }

    Функция JSClock сначала создаёт новый Date-объект time; поскольку аргументы не заданы, time создаётся с текущими датой и временем. Затем вызываются методы getHours, getMinutes и getSeconds, присваивающие текущие значения часа, минут и секунд переменным hour, minute и second.

    Следующие 4 оператора строят строковое значение на базе time. Первый оператор создаёт переменную temp, присваивая её значение путём использования условного выражения; если hour больше 12, (hour - 12), иначе просто hour, если только hour не 0, тогда он становится 12.

    Следующий оператор присоединяет значение minute к temp. Если значение minute меньше 10, условное выражение прибавляет строку с предшествующим нулём; иначе добавляется строка с разделяющим двоеточием. Затем оператор присоединяет второе значение к temp тем же способом.

    Наконец, условное выражение присоединяет "PM" к temp, если hour равен 12 или больше; иначе присоединяется "AM".



    Объект Function

    Предопределённый объект Function специфицирует строку кода JavaScript, которая компилируется как функция.

    Создание Function-объекта:

    functionObjectName = new Function ([arg1, arg2, ... argn], functionBody)
    functionObjectName это имя переменной или свойства существующего объекта. Это также может быть объект с последующим именем обработчика события, в нижнем регистре, таким как window.onerror.
    arg1, arg2, ... argn это аргументы, используемые функцией в качестве имён формальных аргументов. Каждый обязан быть строкой, соответствующей верному идентификатору JavaScript; например, "x" или "theForm".
    functionBody это строка, специфицирующая код JavaScript, компилируемый как тело функции.

    Function-объекты вычисляются всякий раз при их использовании. Это менее эффективно, чем объявление функции и вызов её в коде, поскольку объявленные функции компилируются.
    Дополнительно Вы можете также использовать оператор function и выражение function. См. книгу .
    Следующий код присваивает функцию переменной setBGColor. Эта функция устанавливает цвет фона документа.
    var setBGColor = new Function("document.bgColor='antiquewhite'")
    Чтобы вызвать Function-объект, Вы можете специфицировать имя переменной так, будто это функция. Следующий код выполняет функцию, специфицированную переменной setBGColor:

    var colorChoice="antiquewhite"

    if (colorChoice=="antiquewhite") {setBGColor()}
    Вы можете назначить функцию обработчику события одним из следующих способов:

    1. document.form1.colorButton.onclick=setBGColor

    2.
    VALUE="Change background color"

    onClick="setBGColor()">
    Создание переменной setBGColor, показанное выше, аналогично объявлению следующей функции:

    function setBGColor() {

    document.bgColor='antiquewhite'
    }
    Присвоение функции переменной похоже на объявление функции, но есть и отличия:

  • Если Вы присваиваете функцию переменной, используя var setBGColor = new Function("..."), setBGColor является переменной, для которой текущим значением является ссылка на функцию, созданную оператором new Function().

  • Если Вы создаёте функцию, используя function setBGColor() {...}, setBGColor не является переменной. Это имя функции.

  • Вы можете вложить одну функцию в другую. Вложенная (внутренняя) функция является private для своего контейнера (внешней функции):

  • Доступ ко внутренней функции имеется только из операторов во внешней функции.
  • Внутренняя функция может использовать аргументы и переменные внешней функции. Внешняя функция не может использовать аргументы и переменные внутренней функции.




  • Объект Math

    Предопределённый объект Math имеет свойства и объекты для работы с математическими константами и функциями. Например, свойство PI объекта Math имеет значение pi (3.141...), которое Вы можете использовать в приложении таким образом:

    Math.PI
    Аналогично и стандартные математические функции являются методами объекта Math. Сюда входят тригонометрические, логарифмические, экспоненциальные и другие функции. Например, Если Вы хотите использовать тригонометрическую функцию sine/синус, Вы можете записать:
    Math.sin(1.56)
    Заметьте, что все тригонометрические методы объекта Math принимают аргументы в радианах.

    В таблице содержится резюме по методам объекта Math.
    Таблица 7.1   Методы Объекта Math


    Метод

    Описание
    abs

    Абсолютное значение.
    sin, cos, tan Стандартные тригонометрические функции; аргумент в радианах.
    acos, asin, atan, atan2 Инверсные тригонометрические функции; возвращают значения в радианах.
    exp, logЭкспоненциальный и натуральный логарифмы, база e.
    ceil Возвращает ближайшее целое число, больше или равное аргументу.
    floor Возвращает наибольшее целое число, меньше или равное аргументу.
    min, max Возвращает больший или меньший (соответственно) из двух аргументов.
    pow Степень; первый аргумент это база, второй показатель степени.
    randomВозвращает случайное число в диапазоне от 0 до 1.
    round Округляет аргумент до ближайшего целого.sqrt Квадратный корень.

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




    Объект Number

    Объект Number содержит свойства для работы с числовыми константами, такими как максимальное значение, not-a-number и infinity/бесконечность. Вы не можете изменить значения этих свойств и будете использовать их таким образом:
    biggestNum = Number.MAX_VALUE

    smallestNum = Number.MIN_VALUE

    infiniteNum = Number.POSITIVE_INFINITY

    negInfiniteNum = Number.NEGATIVE_INFINITY

    notANum = Number.NaN
    Вы всегда обращаетесь к свойствам предопределённого объекта Number так, как показано выше, а не как к свойствам Number-объекта, созданного Вами.
    В таблице дано резюме по свойствам объекта Number.

    Таблица 7.2   Свойства Объекта Number



    Свойство

    Описание

    MAX_VALUE

    Наибольшее представимое число. MIN_VALUE Наименьшее представимое число.NaN Специальное значение "not a number/не число".
    NEGATIVE_INFINITY Специальное значение отрицательной бесконечность; возвращается при переполнении. POSITIVE_INFINITY Специальное значение положительной бесконечности; возвращается при переполнении.

    Прототип Number предоставляет методы для запроса информации от Number-объектов в разных форматах. В следующей таблице дано резюме по методам Number.prototype.


    Таблица 7.3   Методы Number.prototype



    Метод
    Описание
    toExponential

    Возвращает строку - число в экспоненциальной нотации.
    toFixed Возвращает строку - число в нотации с плавающей точкой.
    toPrecision Возвращает строку - число специфицированной точности в нотации с плавающей точкой.
    toSource Возвращает литерал объекта - специфицированный Number-объект; Вы можете использовать это значение для создания нового объекта. Переопределяет метод Object.toSource. toString Возвращает строку - специфицированный объект. Переопределяет метод Object.toString.
    valueOf Возвращает примитивное значение специфицированного объекта. Переопределяет метод Object.valueOf.



    Объект Packages

    Если Java-класс не является частью пакетов java, sun или netscape, Вы можете получить к нему доступ через объект Packages. Например, предположим, корпорация Redwood использует Java-пакет под названием redwood как контейнер различных Java-классов. Чтобы создать экземпляр класса HelloWorld из redwood, Вы осуществляете доступ к конструктору класса так:
    var red = new Packages.redwood.HelloWorld()
    Вы можете также иметь доступ к классам в пакете по умолчанию (то есть к классам, не указывающим пакет явно). Например, если класс HelloWorld находится непосредственно в пути CLASSPATH, а не в пакете, Вы можете получить к нему доступ так:
    var red = new Packages.HelloWorld()
    Объекты LiveConnect java, sun и netscape являются аббревиатурами для наиболее часто употребляющихся Java-пакетов. Например:
    var myString = new java.lang.String("Hello world")
    вместо более длинной версии:

    var myString = new Packages.java.lang.String("Hello world")


    Объект RegExp

    Объект RegExp позволяет работать с регулярными выражениями. описан в



    Объект String

    Объект String является оболочкой вокруг примитивного типа данных string. Не путайте строковой литерал с объектом String. Например, следующий код создаёт строковой литерал s1 и String-объект s2:

    s1 = "foo" //создаётся строковое литеральное значение

    s2 = new String("foo") //создаётся String-объект
    Вы можете вызвать любой из методов объекта String в строковом литеральном значении - JavaScript автоматически конвертирует строковой литерал во временный String-объект, вызывает метод, затем уничтожает временный String-объект. Вы можете также использовать со строковым литералом свойство String.length.
    Вы, как правило, должны использовать строковые литералы, если только Вам не нужно использовать именно String-объект, так как String-объекты могут иметь непредсказуемое поведение. Например:
    s1 = "2 + 2" //строковое литеральное значение

    s2 = new String("2 + 2")//String-объект

    eval(s1) //возвращает число 4

    eval(s2) //возвращает строку "2 + 2"
    Объект String имеет только одно свойство, length, которое обозначает количество символов в строке. Например, следующий код присваивает переменной x значение 13, так как строка "Hello, World!" содержит 13 символов:
    myString = "Hello, World!"

    x = mystring.length
    Объект String имеет методы двух типов: возвращающие варианты самой строки, такие методы как substring и toUpperCase, и методы, которые возвращают HTML-форматированную версию строки, такие методы как bold и link.
    Например, используя предыдущий пример, и mystring.toUpperCase(), и "hello, world!".toUpperCase() возвращают строку "HELLO, WORLD!"
    Метод substring принимает два аргумента и возвращает подстроку между двумя аргументами. Используя предыдущий пример, mystring.substring(4, 9) возвращает строку "o, Wo". См. метод substring объекта String в книге
    .
    Объект String имеет также несколько методов для автоматического HTML-форматирования, такие как bold - для создания текста с "жирным" шрифтом и link - для создания гиперссылки. Например, Вы можете создать гиперссылку на гипотетический URL методом link:

    mystring.link("http://www.helloworld.com")

    В таблице дано резюме по методам String-экземпляров.

    Таблица 7.4   Методы Экземпляров Объекта String
    Метод


    Описание
    anchor
    Создаёт именованный "якорь" HTML.

    big, blink, bold,
    fixed, italics, small,
    strike, sub, sup Форматируют строку HTML.

    charAt, charCodeAt Возвращают символ или код символа в специфицированной позиции в строке.

    indexOf, lastIndexOf Возвращают позицию специфицированной подстроки в строке или последнюю позицию специфицированной подстроки, соответственно. link Создаёт гиперссылку HTML.concat Объединяет текст двух строк и возвращает новую строку. fromCharCode Конструирует строку из специфицированной последовательности значений Unicode. Это метод класса String, а не String-экземпляра.split Делит String-объект на массив строк, разделяя строку на подстроки.

    slice Извлекает часть строки и возвращает новую строку.

    substring, substr Возвращает специфицированный поднабор строки, специфицируя либо начальный и конечный индексы, либо начальный индекс и размер.

    match, replace, search Работа с регулярными выражениями.toLowerCase, toUpperCase Возвращает все символы в строке в нижнем или верхнем регистре, соответственно.





    Copyright © 2000 Все Права Зарезервированы.

    Дата последнего обновления 28 сентября 2000 года.

    Объекты и Свойства

    Объект в JavaScript имеет ассоциированные с ним свойства. Вы получаете доступ к свойству очень просто:

    объектаИмя.свойстваИмя
    И имя объекта, и имя свойства чувствительны к регистру. Вы определяете свойство, присваивая ему значение. Например, предположим, имеется объект myCar (начиная отсюда, примем для удобства, что объект уже существует). Вы можете создать свойства make, model и year таким образом:
    myCar.make = "Ford";

    myCar.model = "Mustang";

    myCar.year = 1969;
    Массив является упорядоченным набором значений, ассоциированных с именем одной переменной. Свойства и массивы JavaScript очень тесно связаны; фактически они являются разными интерфейсами для одной и той же структуры данных. Так, например, Вы можете получить доступ к свойствам объекта myCar:
    myCar["make"] = "Ford"

    myCar["model"] = "Mustang"

    myCar["year"] = 1967
    Этот тип массива известен как ассоциативный массив, поскольку каждый элемент индекса ассоциирован также со строковым значением. Следующая функция отображает свойства и имя объекта как аргументы функции:
    function show_props(obj, obj_name) {

    var result = "";

    for (var i in obj)

    result += obj_name + "." + i + " = " + obj[i] + "\n";

    return result

    }
    Итак, вызов функции show_props(myCar, "myCar") вернёт:
    myCar.make = Ford

    myCar.model = Mustang

    myCar.year = 1967



    Объекты JavaArray и JavaObject

    В большинстве случаев, если Вы передаёте JavaArray или JavaObject JavaScript в качестве параметра Java-методу, Java просто снимает оболочку с объекта; в некоторых случаях объект приводится к другому типу данных в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    Любой интерфейс или класс, совместимый при присвоении с развёрнутым /unwrapped объектом.
    Объект разворачивается.
    java.lang.String
    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта, и результат возвращается как новый экземпляр объекта java.lang.String.
    byte
    char
    double
    float
    int
    long
    short
    Объект разворачивается, и возникает одна из следующих ситуаций:

    Если развёрнутый Java-объект имеет метод doubleValue, the JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом.
    Если развёрнутый Java-объект не имеет метода doubleValue, возникает ошибка.

    boolean
    В JavaScript 1.3 и более поздних версиях, объект разворачивается, и возникает одна из следующих ситуаций:


    Если объект - null, он конвертируется в false.
    Если объект имеет какое-либо другое значение, он конвертируется в true.
    В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:


    Если развёрнутый объект имеет метод booleanValue, the исходный объект конвертируется в return-значение.
    Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.
    Интерфейс или класс совместим для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра. То есть, следующий оператор должен возвращать true:
    развёрнутыйОбъект instanceof параметраТип


    Объекты JavaClass

    Если Вы передаёте объект JavaClass из JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    java.lang.Class
    Объект разворачивается.
    java.lang.JSObject
    java.lang.Object
    Объект JavaClas разворачивается в новый экземпляр объекта java.lang.JSObject.
    java.lang.String
    Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.
    boolean
    В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:


    Если объект - null, он конвертируется в false.
    Если объект имеет какое-либо другое значение, он конвертируется в true.
    В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:


    Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
    Если развёрнутый объект не имеет метода booleanValue, конвертация терпит неудачу.


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

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

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




  • Область Видимости/Scope Переменной

    Если Вы устанавливаете идентификатор переменной путём присваивания значения вне функции, такая переменная называется глобальной, поскольку доступна в любом месте текущего документа. Если Вы объявляете переменную внутри функции, она называется локальной, поскольку "видна"/доступна только внутри этой функции.

    Использование var для объявления глобальной переменной находится на Вашем усмотрении. Однако Вы обязаны использовать var для объявления переменной внутри функции.

    Вы можете обращаться к переменным, объявленным в одном окне или фрэйме, из другого окна или фрэйма, специфицируя имя окна или фрэйма. Например, если переменная phoneNumber объявлена во FRAMESET-документе, Вы можете обратиться к ней из дочернего фрэйма: parent.phoneNumber.


    Обработка Исключений Java в JavaScript

    Если код Java прерывается на этапе прогона программы, он вызывает исключение. Если Ваш JavaScript-код имеет доступ к члену данных Java или методу и терпит неудачу, исключение Java передаётся в JavaScript для обработки. Начиная с JavaScript 1.4, Вы можете отловить это исключение в операторе try...catch.
    Например, предположим, Вы используете Java-метод forName для присвоения имени Java-класа переменной theClass. Метод forName вызывает исключение, если передаваемое Вами значение не вычисляется в имя Java-класса. Поместите оператор присвоения forName в блок try для обработки исключения:
    function getClass(javaClassName) {

    try {

    var theClass = java.lang.Class.forName(javaClassName);

    } catch (e) {

    return ("The Java exception is " + e);

    }

    return theClass

    }
    В этом примере, если javaClassName вычисляется в верное имя класса, такое как "java.lang.String", присвоение проходит успешно. Если javaClassName вычисляется в неверное имя класса, такое как "String", функция getClass отлавливает исключение и возвращает нечто подобное:
    The Java exception is java.lang.ClassNotFoundException: String
    См. в разделе информацию об исключениях JavaScript.


    Обработка Ошибок JavaScript в Java

    Когда JavaScript-код вызываемый из Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в операторе try...catch. Исключение JavaScript доступно в Вашем Java-коде как экземпляр netscape.javascript.JSException.
    JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, аналогично тому, как экземпляры JSObject являются оболочками для JavaScript-объектов. Используйте JSException, если Вы вычисляете JavaScript-код в Java.
    Если Вы вычисляете JavaScript-код в Java, следующие ситуации могут вызвать ошибки времени выполнения:


    Код JavaScript не вычисляется или из-за ошибки компиляции JavaScript, или из-за какой-нибудь другой ошибки времени выполнения.
    Интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException.


    Java успешно вычисляет JavaScript-код, но JavaScript-код выполняет необработанный оператор throw.
    JavaScript вызывает исключение, которое обёрнуто как экземпляр JSException. Используйте метод getWrappedException из JSException для развёртывания этого исключения в Java.
    Например, предположим, что Java-объект eTest вычисляет строку jsCode, которую Вы ему передали. Вы можете отреагировать на любую ошибку времени выполнения, возникающую при вычислении, реализуя такой обработчик исключения:
    import netscape.javascript.JSObject;

    import netscape.javascript.JSException;

    public class eTest {

    public static Object doit(JSObject obj, String jsCode) {

    try {

    obj.eval(jsCode);

    } catch (JSException e) {

    if (e.getWrappedException()==null)

    return e;


    return e.getWrappedException();

    }

    return null;

    }

    }

    В этом примере код блока try пытается вычислить строку jsCode, переданную ему Вами. Скажем, Вы передали строку "myFunction()" в качестве значения jsCode. Если myFunction не определена как функция JavaScript, интерпретатор JavaScript не может вычислить jsCode. Интерпретатор генерирует сообщение об ошибке, Java-обработчик отлавливает сообщение, а метод doit возвращает экземпляр объекта netscape.javascript.JSException.

    Предположим, однако, что myFunction определена в JavaScript так:

    function myFunction() {

    try {

    if (theCondition == true) {

    return "Everything's ok";

    } else {

    throw "JavaScript error occurred" ;

    }

    } catch (e) {

    if (canHandle == true) {

    handleIt();

    } else {

    throw e;

    }

    }

    }

    Если theCondition - false, функция вызывает исключение. Это исключение отлавливается в коде JavaScript, и, если canHandle - true, JavaScript обрабатывает исключение. Если canHandle - false, исключение повторно вызывается, Java-обработчик отлавливает его, а метод doit возвращает Java-строку:

    JavaScript error occurred

    См. в разделе полную информацию об исключениях JavaScript.



    Обратная Совместимость


    В JavaScript 1.3 и ранее, класс JSException имел три public-конструктора, которые по выбору принимали строковой аргумент, специфицирующий детали сообщения или другую информацию для исключения. Метод getWrappedException отсутствовал.

    Используйте оператор try...catch для обработки LiveConnect-исключений в JavaScript 1.3 и более ранних версиях таким образом:

    try {

    global.eval("foo.bar = 999;");

    } catch (Exception e) {

    if (e instanceof JSException) {

    jsCodeFailed()";

    } else {

    otherCodeFailed();

    }

    }

    В этом примере оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed, если оператор eval в блоке try вызывает JSException; метод otherCodeFailed выполняется в случае, если блок try вызывает какую-либо иную ошибку.



    Операции Присвоения

    Операция присвоения присваивает левому операнду значение на базе правого операнда. Базовой операцией присвоения является знак равенства (=), который присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение y переменной x.

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



    Таблица 3.1    Операции Присвоения



    Сокращённое обозначение
    Значение

    x += y
    x = x + y

    x -= y
    x = x - y
    x *= y x = x * y
    x /= y x = x / y
    x %= y
    x = x % y
    x <<= y x = x << y

    x >>= y
    x = x >> y
    x >>>= y
    x = x >>> y
    x &= y x = x & y

    x ^= y
    x = x ^ y
    x |= yx = x | y




    Операции Сравнения

    Операция сравнения сравнивает операнды и возвращает логическое значение на базе верности сравнения. Операндами могут быть числа, строки, логические значения и объекты. Строки сравниваются на базе стандартного лексикографического порядка с использованием значений Unicode. В таблице даны операции сравнения.


    Таблица 3.2 Операции Сравнения



    Операция
    Описание
    Примеры, возвращающие true

    Равно (==) Возвращает true, если операнды равны. Если операнды разных типов, JavaScript пытается конвертировать операнды до типа, пригодного для сравнения.
    3 == var1
    "3" == var1
    3 == '3' Не равно (!=) Возвращает true, если операнды не равны. Если операнды разных типов, JavaScript пытается конвертировать операнды до типа, пригодного для сравнения.
    var1 != 4
    var2 != "3" Строго равно (===)Возвращает true, если операнды равны и одного типа.
    3 === var1 Строго не равно (!==) Возвращает true, если операнды не равны и/или не одного типа.
    var1 !== "3"
    3 !== '3' Больше (>)Возвращает true, если левый операнд больше правого.
    var2 > var1 Больше или равно (>=) Возвращает true, если левый операнд больше правого или равен ему.
    var2 >= var1
    var1 >= 3 Меньше (<) Возвращает true, если левый операнд меньше правого.var1 < var2 Меньше или равно (<=) Возвращает true, если левый операнд меньше правого или равен ему.
    var1 <= var2
    var2 <= 5
    Эти примеры предполагают, что переменной var1 присвоено значение 3, а переменной var2 значение 4.



    Операции

    В этом разделе рассмотрены операции и содержится информация о приоритете выполнения операций.

    В JavaScript имеются следующие типы операций:


  • В JavaScript имеются бинарные и унарные операции. Для выполнения бинарной операции необходимы два операнда: один до знака операции и один - после:

    операнд1 операция операнд2

    Например, 3+4 или x*y.
    Для выполнения унарной операции необходим один операнд, до или после знака операции:

    операция операнд

    или

    операнд операция

    Например, x++ или ++x.

    Кроме того, в JavaScript есть условная тернарная операция. Она требует наличия трёх операндов.



    Операция "запятая"

    Операция "запятая" (,) просто вычисляет оба операнда и возвращает значение второго операнда. Первоначально использовалась внутри цикла for, чтобы дать возможность обновлять значения нескольких переменных за один проход цикла.

    Например, если имеется 2-мерный массив из 10 элементов по измерению, следующий код использует операцию "запятая" для инкремента двух переменных за один проход. Печатаются значения элементов по диагонали массива:

    for (var i=0, j=9; i <= 9; i++, j--)

    document.writeln("a["+i+","+j+"]= " + a[i*10 +j])

    Заметьте, что двухмерные массивы ещё не поддерживаются. Этот пример эмулирует двухмерный массив, используя одномерный массив.

    Оператор break

    Используйте оператор break для прерывания цикла switch или оператора с меткой label.

  • Если Вы используете break без label, он немедленно прерывает ближайший содержащий while, do-while, for или switch и передаёт управление следующему оператору.
  • Если Вы используете break с label, он прерывает специфицированный помеченный оператор.


  • Синтаксис оператора break таков:
    1. break

    2. break label
    Первый вариант прерывает ближайший содержащий цикл или switch; второй вариант прерывает специфицированный оператор, имеющий метку.

    Пример.

    Здесь выполняется итерация по элементам массива, пока не будет найден индекс элемента со значением theValue:
    for (i = 0; i < a.length; i++) {

    if (a[i] = theValue)

    break;

    }



    Оператор continue

    Оператор continue используется для рестарта операторов while, do-while, for и label.

  • Если Вы используете continue без label, он прерывает текущую итерацию ближайшего цикла while, do-while или for и продолжает выполнение этого цикла со следующей итерации. В отличие от оператора break, continue не прерывает выполнение цикла полностью. В цикле while он переходит на condition. В цикле for на increment-expression.
  • Если Вы используете continue с label, он применяется к оператору цикла, идентифицированному этим label.


  • Синтаксис оператора continue таков:
    1. continue

    2. continue label


    Пример 1.

    Это пример цикла while с оператором continue, который выполняется, если значение i равно 3. Таким образом, n получает значения 1, 3, 7 и 12.
    i = 0;

    n = 0;

    while (i < 5) {

    i++;

    if (i == 3)

    continue;

    n += i;

    }

    Пример 2.

    Оператор, помеченный как checkiandj, содержит оператор, помеченный как checkj. Если обнаружен continue, программа прерывает текущую итерацию checkj и начинает следующую итерацию. Каждый раз при обнаружении continue, checkj начинает итерацию вновь, пока его условие не возвратит false. Если возвращено false, выполняется оставшаяся часть оператора checkiandj и checkiandj реитерирует, пока его условие не возвратит false. Если возвращается false, программа продолжает выполняться с оператора, следующего после checkiandj.
    Если continue имеет label для checkiandj, программа продолжит выполнение от начала оператора checkiandj.
    checkiandj :

    while (i<4) {

    document.write(i + "
    ");

    i+=1;

    checkj :

    while (j>4) {

    document.write(j + "
    ");

    j-=1;

    if ((j%2)==0)

    continue checkj;

    document.write(j + " is odd.
    ");

    }

    document.write("i = " + i + "
    ");

    document.write("j = " + j + "
    ");

    }



    Оператор do...while

    Оператор do...while повторяется, пока специфицированное выражение - false. Оператор do...while выглядит так:

    do {
    statement

    } while (condition)
    statement выполняется один раз перед проверкой условия/condition. Если condition - true, оператор выполняется снова. В конце каждого выполнения condition проверяется. Если condition - false, выполнение останавливается и управление передаётся оператору после do...while.


    Пример.

    В этом примере цикл do итерируется минимум один раз и повторяет итерации, пока i меньше 5.
    do {

    i+=1;

    document.write(i);

    } while (i<5);



    Оператор for...in

    Оператор for...in итерирует специфицированную переменную по всем свойствам объекта. Для каждого достигнутого свойства JavaScript выполняет специфицированные операторы. Оператор for...in выглядит так:

    for (variable in object) {

    statements }

    Пример.

    Эта функция принимает в качестве аргумента объект и имя объекта. Затем она итерирует по всем свойствам этого объекта и возвращает строку - список имён свойств и их значений.
    function dump_props(obj, obj_name) {

    var result = "";

    for (var i in obj) {

    result += obj_name + "." + i + " = " + obj[i] + "
    "

    }

    result += "
    ";

    return result;

    }
    Для объекта car со свойствами make и model результат будет таким:

    car.make = Ford
    car.model = Mustang



    Оператор for

    Цикл for повторяется до тех пор, пока специфицированное значение false. Цикл JavaScript for похож на циклы for Java и C. Оператор for выглядит так:
    for ([initialExpression]; [condition]; [incrementExpression]) {

    statements

    }
    Когда цикл for выполняется, происходит следующее:

  • Инициализирующее выражение initialЕxpression, если имеется, выполняется. Это выражение обычно инициализирует один или более счётчиков цикла, и синтаксис разрешает выражения любой сложности. Это выражение также может объявлять переменные.

  • Вычисляется выражение condition/условное. Если значение condition - true, выполняются statements/операторы цикла. Если значение condition - false, цикл for прекращает работу. Если выражение condition полностью отсутствует, принимается, что condition - true.

  • Выполняются statements.

  • Обновляющее выражение incrementExpression, если имеется, выполняется, и управление возвращается к .

    Пример.

  • Эта функция содержит оператор for, который подсчитывает количество выбранных опций в прокручиваемом списке (объект Select, позволяющий выбрать несколько позиций). Оператор for объявляет переменную i и инициализирует её в нуль. Он проверяет, меньше ли i количества опций объекта Select, выполняет оператор if и инкремент переменной i на единицу после каждого прохода цикла.




    Choose some music types, then click the button below:





    onClick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))">





    Оператор if...else

    Этот оператор используется для выполнения определённых операторов, если логическое условие true; используйте необязательный блок else для выполнения других операторов, если условие false. Оператор if выглядит так:

    if (condition) {

    statements1

    }

    [else {

    statements2

    } ]
    Условие может быть любым выражением JavaScript, вычисляемым в true или false. Выполняемые операторы могут быть любыми операторами JavaScript, включая вложенные операторы if. Если Вам нужно выполнить более одного оператора после операторов if или else, Вы обязаны заключить эти выполняемые операторы в фигурные скобки {}.
    Вы не должны использовать простые присвоения в условном операторе. Например, НЕ используйте такой код:
    if(x = y)

    {

    /* здесь всё верно */

    }
    Если Вам нужно использовать присвоение в условном операторе, введите дополнительные скобки вокруг операции присвоения. Например, if( (x = y) ).
    Не путайте примитивные Boolean-значения true и false со значениями true и false объекта Boolean. Любой объект, чьё значение не undefined, null, zero, NaN или пустая строка, включая объект Boolean со значением false, вычисляется в true, когда передаётся условному оператору. Например:
    var b = new Boolean(false);

    if (b) // это условие вычисляется в true

    Пример.

    В этом примере функция checkData возвращает true, если количество символов в Text-объекте равно трём; иначе, выводит предупреждение и возвращает false.
    function checkData () {

    if (document.form1.threeChar.value.length == 3) {

    return true

    } else {

    alert("Enter exactly three characters. " +

    document.form1.threeChar.value + " is not valid.")

    return false

    }

    }



    Оператор label

    Оператор label является идентификатором, на который можно ссылаться из любого места программы. Например, Вы можете использовать label для идентификации цикла, а затем использовать операторы break или continue для прерывания цикла или продолжения выполнения.

    Синтаксис оператора label выглядит так:
    label :

    statement
    Значением label может быть любой верный идентификатор JavaScript, не являющийся зарезервированным словом. Оператор/statement, идентифицируемый при помощи label, может быть любым оператором.

    Пример.

    В этом примере label markLoop идентифицирует цикл while.
    markLoop:

    while (theMark == true)

    doSomething();

    }



    Оператор switch

    Оператор switch позволяет программе вычислять выражение и пытается сопоставить значение выражения значению в метке case. Если совпадение найдено, программа выполняет ассоциированный оператор. Оператор switch выглядит так:
    switch (expression){

    case label :

    statement;

    break;

    case label :

    statement;

    break;

    ...

    default : statement;

    }
    Программа сначала ищет label, совпадающий со значением expression, а затем выполняет ассоциированный statement/оператор. Если совпадающий label не найден, программа ищет необязательный default statement/оператор по умолчанию и, если он найден, выполняет ассоциированный оператор. Если default statement не найден, программа продолжает выполнять оператор, следующий после конца оператора switch.

    Необязательный оператор break, ассоциированный с меткой case label, гарантирует, что программа прервёт выполнение оператора switch, как только будет выполнен оператор найденного совпадения, и продолжит выполнение с оператора, идущего после оператора switch. Если break отсутствует, программа продолжает выполнение следующего оператора внутри оператора switch.

    Пример.

    Здесь, если expr вычисляется в "Bananas", программа находит совпадение с case "Bananas" и выполняет ассоциированный оператор. Если обнаружен break, программа прерывает switch и выполняет оператор после блока оператора switch. Если break отсутствует, оператор в case "Cherries" также будет выполнен.
    switch (expr) {

    case "Oranges" :

    document.write("Oranges are $0.59 a pound.
    ");

    break;

    case "Apples" :

    document.write("Apples are $0.32 a pound.
    ");

    break;

    case "Bananas" :

    document.write("Bananas are $0.48 a pound.
    ");

    break;

    case "Cherries" :

    document.write("Cherries are $3.00 a pound.
    ");

    break;

    default :

    document.write("Sorry, we are out of " + i + ".
    ");

    }
    document.write("Is there anything else you'd like?
    ");




    Оператор throw

    Оператор throw используется для вызова исключения. Если Вы вызываете исключение, Вы специфицируете выражение, содержащее значение исключения:

    throw expression
    Следующий код вызывает несколько исключений.
    throw "Error2"; // генерирует исключение со строковым значением

    throw 42; // генерирует исключение со значением 42

    throw true; // генерирует исключение со значением true


    При вызове исключения Вы можете специфицировать объект. Затем можно обратиться к свойствам объекта в блоке catch. Следующий пример создаёт объект myUserException типа UserException и использует его в операторе throw.
    // Создаётся объект типа UserException

    function UserException (message) {

    this.message=message;

    this.name="UserException";
    }

    // Создаётся и вызывается экземпляр объекта

    myUserException=new UserException("Value too high");

    throw myUserException;



    Оператор try...catch

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

    Оператор try...catch состоит из блока try, который содержит один или более операторов, и нуль или более блоков catch, содержащих операторы, которые специфицируют действия при вызове исключения в блоке try. То есть, если Вы хотите выполнить блок try и он не выполняется, Вы передаёте управление в блок catch. Если любой оператор блока try (или оператор функции, вызываемой из блока try) вызывает исключение, управление немедленно передаётся в блок catch. Если исключение не было вызвано, блок catch пропускается. Блок finally выполняется после выполнения блоков try и catch, но до выполнения оператора, идущего после блока оператора try...catch.
    В следующем примере используется оператор try...catch. Вызывается функция, которая запрашивает название месяца из массива, базируясь на значении, передаваемом функции. Если значение не соответствует номеру месяца (1-12), вызывается исключение со значением "InvalidMonthNo" и операторы блока catch устанавливают переменную в monthName значение "unknown".
    function getMonthName (mo) {

    mo=mo-1; // Уточняется номер месяца по индексу массива (1=Jan, 12=Dec)

    var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",

    "Aug","Sep","Oct","Nov","Dec");

    if (months[mo] != null) {

    return months[mo]

    } else {

    throw "InvalidMonthNo"

    }

    }
    try {

    // попытка выполнить эти операторы:

    monthName=getMonthName(myMonth) // функция может вызвать исключение


    }

    catch (e) {

    monthName="unknown"

    logMyErrors(e) // объект, вызвавший исключение, передаётся обработчику исключений

    }

    Блок catch


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



    Единственный блок catch


    Используйте единственный в данном операторе try...catch блок catch (восстанавливающий блок) для выполнения кода обработки ошибок для каждого исключения, вызываемого в блоке try.

    Единственный блок catch имеет следующий синтаксис:

    catch (catchID) {

    statements

    }

    Блок catch специфицирует идентификатор (catchID в предыдущем синтаксисе), по которому содержится значение, специфицированное оператором throw; Вы можете использовать этот идентификатор для получения информации о вызванном исключении. JavaScript создаёт этот идентификатор при входе в блок catch; идентификатор существует только в период выполнения блока catch; после завершения выполнения блока catch идентификатор больше не доступен.

    Например, следующий код вызывает исключение. Если возникает исключение, управление передаётся в блок catch.

    try {

    throw "myException" // генерируется исключение

    }
    catch (e) {

    // операторы для обработки любого исключения

    logMyErrors(e) // исключение передаётся обработчику ошибок

    }



    Несколько блоков catch


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

    Например, следующая функция вызывает три другие функции (объявленные в другом месте), которые проверяют её аргументы. Если проверяющая функция определяет, что проверяемый компонент неверен, она возвращает 0, заставляя вызывающую функцию вызывать определённое исключение.


    function getCustInfo(name, id, email)

    {

    var n, i, e;

    if (!validate_name(name))

    throw "InvalidNameException"

    else

    n = name;

    if (!validate_id(id))

    throw "InvalidIdException"

    else

    i = id;

    if (!validate_email(email))

    throw "InvalidEmailException"

    else

    e = email;

    cust = (n + " " + i + " " + e);

    return (cust);

    }

    Условные блоки catch управляют вызовом соответствующего обработчика исключений.

    try {

    // функция может вызвать три вида исключений

    getCustInfo("Lee", 1234, "lee@netscape.com")

    }

    catch (e if e == "InvalidNameException") {

    // вызывает обработчик неправильных имён

    bad_name_handler(e)

    }

    catch (e if e == "InvalidIdException") {

    // вызывает обработчик неправильных ids/идентификаторов

    bad_id_handler(e)

    }

    catch (e if e == "InvalidEmailException") {

    // вызывает обработчик неправильных email-адресов

    bad_email_handler(e)

    }

    catch (e){

    // незвестное исключение записывается в log-файл

    logError(e)

    }

    Блок finally


    Блок finally содержит операторы, выполняемые после выполнения блоков try и catch, но до выполнения операторов, идущих после оператора try...catch. Блок finally выполняется независимо от того, было ли вызвано исключение. Если исключение вызывается, операторы блока finally выполняются даже в том случае, если ни один блок catch не обработал исключение.

    Вы можете использовать блок finally для корректного завершения скрипта при возникновении исключения; например, Вам может понадобиться освободить ресурс, связанный скриптом. В следующем примере файл открывается и операторы работают с ним (серверный JavaScript даёт возможность доступа к файлам). Если вызывается исключение при открытом файле, блок finally закрывает файл до того, как скрипт потерпит неудачу.

    openMyFile();

    try {

    writeMyFile(theData)

    }

    finally {

    closeMyFile() // ресурс всегда закрывается

    }

    Вложение операторов try...catch


    Вы можете вкладывать один или более операторов try...catch друг в друга. Если внутренний оператор try...catch не имеет блока catch, на совпадение проверяется блок catch содержащего его оператора try...catch.




    Copyright © 2000 Все Права Зарезервированы.

    Дата последнего обновления 28 сентября 2000 года.

    Оператор while

    Оператор while выполняет свои операторы, пока специфицированное condition/условие - true. Оператор while выглядит так:
    while (condition) {

    statements

    }
    Если condition становится false, операторы внутри цикла прекращают выполняться и управление передаётся оператору, следующему после цикла.
    Проверка условия/condition происходит до выполнения операторов внутри цикла. Если condition возвращает true, операторы выполняются и condition проверяется снова. Если condition возвращает false, выполнение цикла прекращается и управление передаётся оператору, идущему после оператора while.

    Пример 1.

    Этот цикл while итерирует, пока n меньше 3:
    n = 0;

    x = 0;

    while( n < 3 ) {

    n ++;

    x += n;

    }
    При каждой итерации цикл увеличивает n и прибавляет это значение к переменной x. Следовательно, x и n принимают следующие значения:

  • После первого прохода: n = 1 и x = 1

  • После второго прохода: n = 2 и x = 3

  • После третьего прохода: n = 3 и x = 6


  • После выполнения трёх проходов цикла, condition n < 3 больше не true, поэтому выполнение цикла прерывается.

    Пример 2: Бесконечный цикл.

    Убедитесь, что условие цикла когда-нибудь станет false; иначе цикл никогда не прервётся. Операторы следующего цикла while выполняются бесконечно, поскольку условие никогда не станет false:
    while (true) {

    alert("Hello, world") }



    Оператор with

    Оператор with устанавливает объект по умолчанию для набора блока операторов. JavaScript просматривает неквалифицированные имена внутри блока операторов и определяет, являются ли имена свойствами объекта по умолчанию. Если неквалифицированное имя является свойством, то это свойство используется в операторе; иначе, используется локальная или глобальная переменная.

    Оператор with выглядит так:
    with (object){

    statements

    }

    Пример.

    Здесь оператор with специфицирует, что объект Math является объектом по умолчанию. Операторы после оператора with обращаются к свойству PI и к методам cos и sin без специфицирования объекта. JavaScript принимает объект Math как объект для этих обращений.
    var a, x, y;;

    var r=10

    with (Math) {

    a = PI * r * r;

    x = r * cos(PI);

    y = r * sin(PI/2);

    }

    Примечание:

    Использование оператора with может значительно замедлить выполнение программы.

    Операторы Циклов

    Цикл/loop это набор операторов, который выполняется несколько раз, пока выполняется специфицированное условие. JavaScript поддерживает циклические операторы for, do...while и while, а также label (label сам по себе не является оператором цикла, но часто используется с указанными операторами). Кроме того, Вы можете использовать операторы break и continue внутри операторов циклов.

    Ещё один оператор цикла, for...in, также выполняет свои операторы циклически, но используется для работы с объектами. См. .



    Операторы Манипуляции Объектами

    JavaScript использует операторы for...in и with для манипулирования объектами.



    Операторы Обработки Исключений

    Вы можете вызывать исключение оператором throw и обрабатывать его операторами try...catch.

    Оператор try...catch используется также для обработки исключений Java. См. разделы и .




    Определение Функций

    Определение функции состоит из ключевого слова function и

  • Имени функции.
  • Списка аргументов, заключённых в скобки и разделяемых запятыми.
  • Операторов JavaScript, составляющих содержание функции, заключённых в фигурные скобки { }. Операторы функции могут могут содержать вызовы других функций, определённых в текущем приложении.


  • Например, следующий код определяет простую функцию под названием square:

    function square(number) {

    return number * number;

    }

    Функция square принимает один аргумент - number. Функция состоит из одного оператора, который возвращает квадрат аргумента функции. Оператор return специфицирует значение, возвращаемое функцией.

    return number * number

    Все параметры передаются в функцию по значению; значение передаётся в функцию, но, если функция изменяет значение этого параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаёте в качестве параметра объект и функция изменяет свойства объекта, это изменение видно вне функции, как показано в примере:

    function myFunc(theObject) {

    theObject.make="Toyota"

    }

    mycar = {make:"Honda", model:"Accord", year:1998};

    x=mycar.make; // возвращает Honda

    myFunc(mycar); // передаёт функции объект mycar

    y=mycar.make; // возвращает Toyota (prop было изменено функцией)

    Функция может определяться на базе условия. Например, в данном определении функции:
    if (num == 0)
    {

    function myFunc(theObject) {

    theObject.make="Toyota"

    }

    }

    функция myFunc определена только в том случае, если переменная num равна 0. Если num не равна 0, функция не определена, и любая попытка выполнить её потерпит неудачу.
    Вы также можете определять Function-объекты, как описано в .

    Метод это функция, ассоциированная с объектом. Об объектах и методах Вы можете узнать больше в

    Функция может быть также определена внутри выражения. Это называется функцией выражения. Обычно такая функция безымянна/anonymous; она не должна иметь имени. Например, функция square может быть определена так:

    const square = function(number) {return number * number};
    Это удобно при передаче функции другой функции в качестве аргумента. В примере показана функция map, определяемая и вызываемая с анонимной функцией в качестве параметра:

    function map(f,a) {

    var result=new Array;

    for (var i = 0; i != a.length; i++)

    result[i] = f(a[i]);

    return result;

    }

    Вызов

    map(function(x) {return x * x * x}, [0, 1, 2, 5, 10];
    возвращает [0, 1, 8, 125, 1000].




    Определение Getter'ов и Setter'ов

    Getter это метод, получающий значение отдельного свойства. Setter это метод, устанавливающий значение отдельного свойства. Вы можете определить getter и setter в любом предопределённом объекте ядра или в пользовательском объекте, поддерживающем добавление новых свойств. Синтаксис определения getter и setter использует синтаксис литерала объекта.

    Следующая сессия JS-оболочки иллюстрирует, как getter и setter могут работать для определённого пользователем объекта o. JS-оболочка является приложением, позволяющим разработчикам тестировать код JavaScript в пакетном режиме или интерактивно.
    Свойствами объекта о являются:

  • o.a - число

  • o.b - getter, возвращающий o.a плюс 1

  • o.c - setter, устанавливающий значение o.a в половину его величины

  • js> o = new Object;

    [object Object]

    js> o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}};

    [object Object]

    js> o.a

    7

    js> o.b

    8

    js> o.c = 50

    js> o.a

    25

    js>

    Эта сессия JavaScript иллюстрирует то, как getter и setter могут расширять прототип Date, добавляя свойство year ко всем экземплярам предопределённого класса Date. Она использует существующие методы getFullYear и setFullYear класса Date для поддержки getter и setter свойства year.

    Эти операторы определяют getter и setter для свойства year:
    js> var d = Date.prototype;

    js> d.year getter= function() { return this.getFullYear(); };
    js> d.year setter= function(y) { return this.setFullYear(y); };

    Следующие операторы используют getter и setter в Date-объекте:
    js> var now = new Date;

    js> print(now.year);

    2000

    js> now.year=2001;

    987617605170

    js> print(now);

    Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001



    Определение Класса

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



    Определение Методов

    Метод это функция, ассоциированная с объектом. Метод определяется так же, как стандартная функция. Затем используется следующий синтаксис для ассоциирования функции с уже существующим объектом:

    object.methodname = function_name
    где object это существующий объект, methodname это имя определяемого Вами метода, а function_name имя функции.
    Вы затем вызываете метод в контексте объекта:
    object.methodname(params);
    Вы можете также определить методы для типа объекта, включив определение метода в конструктор функции. Можно определить функцию, которая форматирует и отображает свойства ранее определённых car-объектов; например,
    function displayCar() {

    var result = "A Beautiful " + this.year + " " + this.make

    + " " + this.model;

    pretty_print(result);

    }
    где pretty_print это функция для отображения горизонтальной линии и строки. Обратите внимание на использование this для ссылки на объект, которому принадлежат методы.
    Можно сделать эту функцию методом в car, добавив оператор:
    this.displayCar = displayCar;

    к определению объекта. Так полное определение car будет выглядеть теперь:
    function car(make, model, year, owner) {

    this.make = make;

    this.model = model;

    this.year = year;

    this.owner = owner;

    this.displayCar = displayCar;

    }

    Теперь Вы можете вызвать метод displayCar в каждом экземпляре:
    car1.displayCar()

    car2.displayCar()
    Это даст результат, показанный на рисунке.
    Рисунок 7.1 Отображение вывода метода

    Определение Методов




    Определение Свойств для Типа Объекта

    Вы можете добавлять свойство к ранее определённому типу объекта через использование свойства prototype. Так определяется свойство, которое совместно используется всеми объектами специфицированного типа, а не только одним данным экземпляром этого объекта. Следующий код добавляет свойство color ко всем объекта типа car, а затем присваивает значение свойству color объекта car1.

    Car.prototype.color=null;
    car1.color="black";
    См. дополнительную информацию о свойстве prototype объекта Function в книге
    .




    Определение Взаимодействия Экземпляров

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

    Начиная с JavaScript версии 1.4, JavaScript предоставляет операцию instanceof для тестирования цепочки прототипов. Эта операция работает точно так же, как функция instanceof, рассматриваемая ниже.
    Как уже говорилось в , если Вы используете оператор new и конструктор функции для создания нового объекта, JavaScript устанавливает в свойство __proto__ нового объекта значение свойства prototype конструктора функции. Вы можете использовать это для проверки цепи прототипов.

    Например, предположим, у Вас есть уже рассмотренный ранее набор определений с прототипами, установленными соответствующим образом. Создайте объект __proto__ таким образом:
    chris = new Engineer("Pigman, Chris", ["jsd"], "fiji");
    С этим объектом все следующие операторы будут true:
    chris.__proto__ == Engineer.prototype;

    chris.__proto__.__proto__ == WorkerBee.prototype;

    chris.__proto__.__proto__.__proto__ == Employee.prototype;

    chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype;

    chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null;
    Имея это, Вы можете написать функцию instanceOf:
    function instanceOf(object, constructor) {

    while (object != null) {

    if (object == constructor.prototype)

    return true;

    object = object.__proto__;

    }

    return false;

    }
    При таком определении все следующие выражения будут true:
    instanceOf (chris, Engineer)

    instanceOf (chris, WorkerBee)

    instanceOf (chris, Employee)

    instanceOf (chris, Object)

    Но это выражение будет false:
    instanceOf (chris, SalesPerson)




    Отображение Символов Unicode

    Вы можете использовать Unicode для отображения символов на разных языках или технических символов. Чтобы правильно отображать символы, клиент, такой как Netscape Navigator 4.x или Netscape 6, должен поддерживать Unicode. Кроме того, нужный Unicode-шрифт обязан быть доступен клиенту, а клиентская платформа (ОС) обязана поддерживать Unicode. Часто шрифты Unicode не отображают всех символов Unicode. Некоторые платформы, такие как Windows 95, предоставляют частичную поддержку Unicode.

    Чтобы принять ввод не-ASCII символов, необходимо пересылать ввод клиенту как Unicode. Используя стандартную расширенную клавиатуру, клиент не может легко ввести дополнительные символы, поддерживаемые Unicode. Иногда единственным способом ввести символы Unicode будет использование escape-последовательностей Unicode.

    Дополнительную информацию о Unicode см. на и в книге The Unicode Standard, Version 2.0, опубликованной издательством Addison-Wesley в 1996 году.



    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Переменные

    Вы используете переменные в качестве символических имён значений. Имена переменных, называемые идентификаторы, подчиняются определённым правилам.

    Идентификатор в JavaScript обязан начинаться с латинской буквы, символа подчёркивания/underscore (_) или знака доллара ($); последующие символы имени могут также быть цифрами (0-9). Поскольку JavaScript различает регистр символов, могут использоваться буквы от "A" до "Z" (верхний регистр) и от "a" до "z" (нижний регистр).

    Начиная с JavaScript 1.5, Вы можете использовать в качестве идентификаторов буквы ISO 8859-1 или Unicode, такие как å и ü. Вы можете также использовать в качестве символов в идентификаторах escape-последовательности .
    Вот примеры правильных имён: Number_hits, temp99, _name.



    Побитовые Логические Операции

    Концептуально побитовые логические операции работают так:

  • Операнды конвертируются до 32-битных целых и выражаются серией битов (нулей и единиц).
  • Каждому биту первого операнда соответствует парный бит второго операнда: первый бит - первому, второй - второму, и так далее.
  • Операция выполняется для каждой пары битов, а результат конструируется побитно.

  • Например, бинарное представление 9 это 1001, а бинарное представление 15 это 1111. Итак, если побитовая операция применяется к этим двум числам, результаты будут такими:

  • 15 & 9 даёт 9 (1111 & 1001 = 1001)
  • 15 | 9 даёт 15 (1111 | 1001 = 1111)
  • 15 ^ 9 даёт 6 (1111 ^ 1001 = 0110)




  • Побитовые Операции Сдвига

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

    Операции сдвига конвертируют свои операнды в 32-битные целые и возвращают результат того же типа, что и у левого операнда.

    Операции сдвига перечислены в таблице.


    Таблица 3.5 Побитовые Операции Сдвига




    ОперацияОписание
    Пример

    <<
    (Сдвиг влево) Эта операция сдвигает первый операнд на специфицированное количество битов влево. Излишние биты, смещённые влево, отбрасываются. Справа биты заполняются нулями. 9<<2 даёт 36, поскольку 1001, смещённое на 2 бита влево, становится 100100, то есть 36. >>
    (Сдвиг вправо с сохранением знака) Первый операнд сдвигается на специфицированное количество битов вправо. Излишние биты, смещённые вправо, отбрасываются. Копии самого левого бита вдвигаются слева. 9>>2 даёт 2, поскольку 1001, смещённое на 2 бита вправо, становится 10, то есть 2. Аналогично, -9>>2 даёт -3, поскольку знак сохраняется. >>>
    (Сдвиг вправо с заполнением нулями) Первый операнд сдвигается на специфицированное количество битов вправо. Излишние биты, смещённые вправо, отбрасываются. Слева биты заполняются нулями. 19>>>2 даёт 4, поскольку 10011, смещённое на 2 бита вправо, становится 100, то есть 4. Для неотрицательных чисел, сдвиг вправо с заполнением нулями даёт тот же эффект, что и сдвиг вправо с сохранением знака.



    Побитовые Операции

    Эти операции рассматривают свои операнды как набор 32-битных двоичных чисел (нулей и единиц), а не как 10-ричные, 16-ричные или 8-ричные числа. Например, 10-ричное число 9 имеет бинарное представление 1001. Побитовые операции выполняются над такими двоичными представлениями, но возвращают стандартные числовые значения JavaScript.

    В таблице резюмируется информация о побитовых операциях JavaScript.


    Таблица 3.4 Побитовые Операции




    Операция
    Использование
    Описание

    Побитовое Иa & b Возвращает 1 в каждой битовой позиции, где соответствующие биты обоих операндов равны 1. Побитовое ИЛИ
    a | b Возвращает 1 в каждой битовой позиции, где соответствующие биты одного или обоих операндов равны 1.
    Побитовое исключающее ИЛИ
    a ^ b Возвращает 1 в каждой битовой позиции, где соответствующие биты одного но не обоих операндов равны 1.
    Побитовое НЕ
    ~ aИнвертирует биты операнда.
    Сдвиг влево
    a << b Сдвигает двоичное представление a на b битов влево, заполняя справа нулями. Сдвиг вправо с сохранением знака
    a >> b Сдвигает двоичное представление a на b битов вправо, отбрасывая смещённые биты. Сдвиг вправо с заполнением нулями
    a >>> b Сдвигает двоичное представление a на b битов вправо, отбрасывая смещённые биты и заполняя нулями слева.



    Подклассы и Наследование

    В языках на базе классов Вы создаёте иерархию классов через определения классов. В определении класса Вы можете специфицировать, что новый класс является subclass\подклассом уже существующего класса. Подкласс наследует все свойства суперкласса (родительского) и может дополнительно вводить новые свойства и модифицировать унаследованные. Например, предположим, что класс Employee имеет только свойства name и dept и что Manager является подклассом от Employee, добавляющим свойство reports. В этом случае экземпляр класса Manager будет иметь все три свойства: name, dept и reports.
    JavaScript реализует наследование, позволяя Вам ассоциировать прототипичный объект с любым конструктором функции. Так, Вы можете создать пример Employee-Manager, но используя при этом слегка иную терминологию. Во-первых, Вы определяете конструктор функции Employee, специфицируя свойства name и dept. Затем Вы определяете конструктор функции Manager, специфицируя свойство reports. Наконец, Вы присваиваете новый Employee-объект как прототип конструктору функции Manager. После этого, когда Вы создаёте новый Manager-объект, он наследует it свойства name и dept от объекта Employee.



    Повторное Рассмотрение Наследования Свойств

    Предыдущие разделы показали, как конструкторы и прототипы JavaScript предоставляют иерархию и наследование.

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




    JavaScript это разработанный фирмой Netscape


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









  • Предопределённые Функции

    В JavaScript имеются предопределённые функции верхнего уровня:

  • eval
  • isFinite
  • isNaN
  • parseInt и parseFloat
  • Number и String
  • encodeURI, decodeURI, encodeURIComponent и decodeURIComponent (все доступны, начиная с JavaScript 1.5 и далее).

  • В последующих раздела рассматриваются эти функции. См. также в книге детальную информацию обо всех этих функциях.



    Предопределённые Объекты Ядра

    В этом разделе рассмотрены предопределённые объекты ядра JavaScript: Array, Boolean, Date, Function, Math, Number, RegExp и String.



    Employee

    Остальная часть главы использует иерархию объектов, показанную на рисунке.

    Рисунок 8.1    Простая иерархия объектов



    Employee
    В этом примере использованы следующие объекты:


  • Employee содержит свойства name (значением которого по умолчанию является пустая строка) и dept (значением которого по умолчанию является "general").

  • Manager базируется на Employee. Он добавляет свойство reports (значением которого по умолчанию является пустой массив, который предполагается использовать для размещения в качестве значений массива Employee-объектов).

  • WorkerBee также базируется на Employee. Он добавляет свойство projects (значением которого по умолчанию является пустой массив, который предполагается использовать для размещения в качестве значений массива строк).

  • SalesPerson базируется на WorkerBee. Он добавляет свойство quota (значением которого по умолчанию является 100). Он также переопределяет свойство dept значением "sales", указывая, что все salespersons/продавцы находятся в том же department/департаменте.

  • Engineer базируется на WorkerBee. Он добавляет свойство machine (значением которого по умолчанию является пустая строка), а также переопределяет свойство dept значением "engineering".



  • Changing the Order in an

    Несколько примеров использования регулярных выражений.



    Приоритет Операций

    Приоритет операций определяет порядок выполнения операций при вычислении выражения. Вы можете переопределить порядок выполнения путём использования скобок.

    В таблице описан приоритет операций от низшего к высшему.


    Таблица 3.7  Приоритет Операций


    Тип ОперацииОперации

    "запятая", присвоение= += -= *= /= %= <<= >>= >>>= &= ^= |= условная?: логическое ИЛИ логическое И&& побитовое ИЛИ
    |побитовое исключающее ИЛИ
    ^побитовое И
    &равенство
    == != === !==соотношение
    < <= > >= in instanceof побитовый сдвиг<< >> >>> сложение/вычитание+ - умножение/деление
    * / %отрицание/инкремент
    ! ~ - + ++ -- typeof void delete вызов/создание экземпляра() new член. []



    Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Работа с Массивами Java

    Если любой Java-метод создаёт массив и Вы ссылаетесь на этот массив в JavaScript, Вы работаете с JavaArray. Например, следующий код создаёт JavaArray x из 10 элементов типа int:
    x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)
    Как и объект Array из JavaScript, JavaArray имеет свойство length, которое возвращает количество элементов массива. В отличие от Array.length, JavaArray.length, это свойство только для чтения, поскольку количество элементов Java-массива фиксируется в момент создания.


    Работа с Оболочками

    В JavaScript wrapper\оболочка это объект целевого типа данных языка, содержащий объект исходного языка. При программировании на JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызов методов или доступ к свойству в wrapper вызывает Java-объект. На стороне Java объекты JavaScript "обёртываются" в экземпляры класса netscape.javascript.JSObject и передаются в Java.
    Если JavaScript-объект посылается в Java, машина времени выполнения создаёт Java-оболочку типа JSObject; когда JSObject посылается из Java в JavaScript, машина времени выполнения разворачивает его в оригинальный тип объекта JavaScript. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки JavaScript-свойств.


    Работа с Регулярными Выражениями

    Регулярные выражения используются с методами test и exec объекта RegExp и с методами match, replace, search и split объекта String.Эти методы рассматриваются в книге .



    Таблица 4.2    Методы, Использующие Регулярные Выражения.



    Метод
    Описание

    exec

    Метод объекта RegExp, выполняющий поиск совпадения в строке. Возвращает массив информации. test Метод объекта RegExp, тестирующий на совпадение в строке. Возвращает true или false.
    match Метод объекта String, выполняющий поиск совпадения в строке. Возвращает массив информации или null при отсутствии совпадений.search Метод объекта String, тестирующий на совпадение в строке. Возвращает индекс совпадения или -1, если поиск завершился ничем.replace Метод объекта String, выполняющий поиск совпадения в строке и замещающий совпавшую подстроку замещающей подстрокой.split Метод объекта String, использующий регулярное выражение или фиксированную строку для разбивки строки на массив подстрок.

    Если Вам нужно знать, найден ли патэрн в строке, используйте методы test или search; для получения большей информации (но при замедлении выполнения) используйте методы exec или match. Если Вы используете методы exec или match и если совпадение найдено, эти методы возвращают массив и обновляют свойства объекта регулярного выражения, а также предопределённого объекта регулярного выражения, RegExp. Если совпадение не найдено, метод exec возвращает null (которое конвертируется в false).
    В следующем примере скрипт использует метод exec для поиска совпадения в строке:

    Если Вам не нужен доступ к свойствам регулярного выражения, альтернативным способом создания myArray будет такой скрипт:

    Если Вы хотите сконструировать регулярное выражение из строки, вот ещё один скрипт:



    С помощью этих скриптов находится совпадение и возвращается массив и обновляются свойства, показанные в следующей таблице.



    Таблица 4.3   Результаты Выполнения Регулярного Выражения.



    Объект


    Свойство или Индекс
    Описание


    В этом примере:
    myArray
    Совпавшая строка и все запомненные подстроки. ["dbbd", "bb"]index Индекс совпадений во вводе с базой 0. 1input Строка-оригинал. "cdbbdbsbz"[0] Последние совпавшие символы. "dbbd"myRe lastIndex Индекс, начиная с которого стартует следующее совпадение. (Это свойство установлено только тогда, когда регулярное выражение использует опцию g, описанную в разделе .) 5source Текст патэрна. Обновляется в момент создания регулярного выражения, не исполняется.

    "d(b+)d"

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



    Вывод этого скрипта:

    The value of lastIndex is 5

    Если Ваш скрипт, однако, будет таким:



    он выдаст:

    The value of lastIndex is 0

    Вхождения /d(b+)d/g в этих двух операторах являются разными объектами регулярного выражения и, соответственно, имеют разные значения свойства lastIndex. Если Вам нужен доступ к свойствам регулярного выражения, созданного с помощью инициализатора объекта, Вы должны сначала присвоить это выражение переменной.



    Различия. Резюме.

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




    Таблица 8.1 Сравнение объектных систем на базе классов (Java)
    и на базе прототипов (JavaScript)



    На базе классов (Java)
    На базе прототипов (JavaScript)

    Класс и экземпляр класса являются разными сущностями. Все объекты являются экземплярами. Определяет класс в определении класса; инстанциирует класс методами-конструкторами. Определяет и создаёт набор объектов с помощью конструкторов функций. Создаёт отдельный объект оператором new. То же самое.
    Иерархия объектов конструируется путём использования определения класса для определения подклассов существующих классов. Иерархия объектов конструируется присвоением объекта как прототипа, ассоциированного с конструктором функции.
    Наследует свойства по цепочке классов. Наследует свойства по цепочке прототипов. Определение класса специфицирует все свойства всех экземпляров класса. Свойства не могут добавляться динамически на этапе прогона программы. Конструктор функции или прототип специфицирует начальный набор свойств. Свойства могут удаляться и добавляться динамически в отдельных объектах или сразу для набора объектов.



    Символы

    - (побитовое НЕ) операция - (унарное отрицание) операция -- (декремент) операция ! (логическое НЕ) операция != (не равно) операция !== (строго не равно) операция % (modulus) операция %= операция && (логическое И) операция & (побитовое И) операция &= операция */ комментарий *= операция + (конкатенация строк) операция ++ (инкремент) операция += (конкатенация строк) операция += операция /* комментарий // комментарий /= операция < (меньше) операция << (сдвиг влево) операция ,
    <<= операция <= (меньше или равно) операция == (равно) операция === (строго равно) операция -= операция > (больше) операция >= (больше или равно) операция >> (сдвиг вправо с сохранением знака) операция ,
    >>= операция
    >>> (сдвиг вправо с заполнением нулями) операция ,
    >>>= операция ?: (условная) операция ^ (побитовое исключающее ИЛИ) операция ^= операция | (побитовое ИЛИ) операция |= операция (логическое ИЛИ) операция (запятая) операция

    Словарь



    В словаре определены термины, используемые в приложениях, написанных на языке JavaScript.


    ASCII
    American Standard Code for Information Interchange. Стандартные коды, используемые для хранения символов в компьютере.

    BLObBinary large object/Двоичный большой объект. Формат двоичных данных, хранимых в реляционной базе данных.

    CGICommon Gateway Interface/Общий Интерфейс Шлюзов. Спецификация для коммуникации между HTTP-сервером и программами-шлюзами на сервере. CGI это популярный интерфейс, используемый для создания серверных web-приложений на таких языках, как Perl или C.

    clientweb-браузер, такой как Netscape Navigator.

    client-side/клиентский JavaScript
    Ядро JavaScript плюс расширения, управляющие браузером (Navigator или аналогичный web-браузер), и его DOM. Например, клиентские расширения позволяют приложению размещать элементы в HTML-форме и реагировать на пользовательские события, такие как щелчок мышью, ввод в форму и навигация по страницам. См. также , .

    CORBACommon Object Request Broker Architecture. Стандарт, созданный группой OMG (Object Management Group), программа Object Request Broker (ORB), обслуживающая взаимодействие между объектами в распределённой среде.

    core/ядро JavaScript
    Элементы, общие для клиентского и серверного JavaScript. Ядро JavaScript содержит ядро-набор объектов, таких как Array, Date и Math, и ядро-набор элементов языка, таких как операции, управляющие структуры и операторы. См. также , .

    deprecate/не рекомендуетсяИспользование не рекомендуется, но без удаления из продукта. Если какое-либо свойство JavaScript не рекомендуется для использования, то обычно предлагается альтернатива; Вы не должны в дальнейшем использовать не рекомендуемые возможности, так как они могут быть удалены в последующих версиях.

    ECMAEuropean Computer Manufacturers Association. Ассоциация по международным стандартам по системам информации и коммуникациям.

    ECMAScript
    Стандартизованный международный язык программирования на базе ядра JavaScript. Эта версия стандартизованного JavaScript ведёт себя одинаково во всех приложениях, поддерживающих этот стандарт. Компании могут использовать этот открытый стандартный язык для разработки своих собственных версий JavaScript.

    См. также .

    внешняя функцияФункция, определённая в библиотеке, которая может использоваться в приложениях JavaScript.

    HTMLHypertext Markup Language. Язык разметки, используемый для создания страниц для World Wide Web.

    HTTPHypertext Transfer Protocol. Протокол сообщений, используемый для передачи информации между web-серверами и клиентами.

    IP-адрес

    Набор из четырёх чисел в диапазоне от 0 до 255, разделённых точками, который специфицирует местонахождение по протоколу TCP/IP.

    LiveConnect

    Позволяет коду Java и JavaScript взаимодействовать друг с другом. Из JavaScript Вы можете инстанциировать (создавать экземпляры) Java-объекты и получать доступ к их public-методам и полям. Из Java Вы можете получать доступ к объектам, свойствам и методам JavaScript.

    MIMEMultipart Internet Mail Extension. Стандарт, специфицирующий формат данных, передаваемых в internet.

    primitive value/примитивное значениеДанные, непосредственно представляемые на низшем уровне языка. Примитивное значение JavaScript принадлежит к одному из следующих типов: undefined, null, Boolean, number или string. Вот примеры некоторых примитивных значений:

    a=true // примитивное Булево/Boolean значение

    b=42 // примитивное значение number

    c="Hello world" // примитивное значение string

    if (x==undefined) {} // примитивное значение undefined

    if (x==null) {} // примитивное значение null

    server-side/серверный JavaScriptЯдро JavaScript плюс расширения, которые могут запускать JavaScript только на сервере. Например, серверные расширения дают приложению возможность работать с реляционной базой данных, сохранять информацию между вызовами приложения или выполнять манипуляции с файлами на сервере. См. также , .

    static/статический метод или свойство

    Метод или свойство встроенного объекта, которое не может быть свойством экземпляра этого объекта. Например, Вы можете создать новые экземпляры объекта Date. Некоторые методы из Date, такие как getHours и setDate, являются также методами экземпляров объекта Date. Другие же методы Date, такие как parse и UTC, являются статическими, поэтому экземпляры Date не содержат этих методов.

    URLUniversal Resource Locator/Универсальный Локатор Ресурсов. Схема адресации, используемая в World Wide Web.

    WWWWorld Wide Web/Всемирная Паутина.




    Copyright © 2000 Все Права Зарезервированы.

    Дата последнего обновления 28 сентября 2000 года.

    Соглашения по Документам

    Приложения JavaScript работают на многих операционных системах; информация в этой книге применима для всех версий. Пути файлов и директорий даны в формате Windows (с символами \ для разделения имён каталогов). Для Unix-версий путь директории/каталога - тот же самый, но для разделения используется символ / вместо \.

    В этой книге используются uniform resource locators/универсальные локаторы ресурсов (URL) в следующей форме:
    http://server.domain/path/file.html
    В таком URL server представляет имя сервера, на котором запускается Ваше приложение, как, например research1 или www; domain представляет имя Вашего домена Internet, такое как netscape.com или uiuc.edu; path это структура пути к каталогу-директории на сервере; и file.html представляет конкретный файл. В общем, элементы, выделенные шрифтом italic в URL, являются шаблонами-заглушками, а элементы, выведенные нормальным моноширинным шрифтом являются литералами (т.е. вводятся так, как написано). Если на Вашем сервере используется Secure Sockets Layer (SSL), Вы будете использовать https вместо http в URL.

    В этой книге используются следующие соглашения по шрифтам:

  • Моноширинный шрифт используется для кода примеров и листингов кода, API и элементов языка (таких как имена методов и свойств), имён файлов, путей, имён каталогов, тэгов HTML и любого текста, выводимого на экран. (Моноширинный italic используется для замещаемых в коде значений.)

  • Шрифт Italic используется в названиях книг, выделения текста, переменных и заглушек-шаблонов и слов, используемых в литеральном смысле.

  • Жирный шрифт используется для словарных терминов.
  • Посещённые гиперссылки - зелёного цвета, непосещённые - синего.



  • Copyright © 2000 Все Права Зарезервированы.
    Дата последнего обновления 28 сентября 2000 года.

    Сокращённое Вычисление

    Так как логические выражения вычисляются слева направо, они проверяются на возможность выполнения "сокращённого" вычисления по следующим правилам:

  • false && что-либо сокращённо вычисляется в false.
  • true что-либо сокращённо вычисляется в true.

  • Правила логики гарантируют, что эти вычисления всегда будут корректными. Обратите внимание, что часть что-либо вышеприведённых выражений не вычисляется, поэтому продолжение выполнения вычисления не даст никакого эффекта.



    Соотношение Между Версиями JavaScript и ECMA

    Netscape тесно сотрудничает с ECMA для создания спецификации ECMA. В следующей таблице описаны соотношения между версиями JavaScript и ECMA.

    Таблица 1.2  Версии JavaScript и ECMA

    Версия JavaScript

    Соотношение с Версией ECMA

    JavaScript 1.1 ECMA-262, Edition 1 базируется на JavaScript 1.1. JavaScript 1.2 ECMA-262 не была завершена, когда появилась версия JavaScript 1.2.

    JavaScript 1.2 не полностью совместима с ECMA-262, Edition 1 по следующим причинам:

  • Netscape разработал в JavaScript 1.2 дополнительные возможности, которые не вошли в ECMA-262.

  • ECMA-262 добавила две новые возможности: интернационализация через Unicode и универсальное поведение на всех платформах. Некоторые возможности JavaScript 1.2, такие как объект Date, были платформозависимыми и вели себя по разному на разных платформах.

  • JavaScript 1.3 JavaScript 1.3 полностью совместим с ECMA-262, Edition 1.
    JavaScript 1.3 устранил несоответствие между JavaScript 1.2 и ECMA-262, сохранив все дополнительные возможности JavaScript 1.2, за исключением == и !=, которые были изменены для обеспечения соответствия с ECMA-262. JavaScript 1.4 JavaScript 1.4 полностью совместим с ECMA-262, Edition 1.
    Третья версия спецификации ECMA была не закончена, когда JavaScript 1.4 вышел в свет. JavaScript 1.5 JavaScript 1.5 полностью совместим с ECMA-262, Edition 3.

    Примечание:

    ECMA-262, Edition 2 содержал незначительные редакторские поправки и исправления спецификации Edition 1. Рабочая группа TC39 ECMA работает в настоящее время над ECMAScript Edition 4, которая соответствует будущей версии JavaScript - JavaScript 2.0.
    Книга
    указывает, какие возможности языка совместимы с ECMA.
    JavaScript всегда будет содержать возможности, не вошедшие в спецификацию ECMA; JavaScript совместим с ECMA, предоставляя, в то же время, дополнительные возможности.



    Совместимость 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.



    Создание Иерархии

    Есть несколько способов определить подходящий конструктор функции для реализации иерархии Employee. Какой из них выбрать, во многом зависит от того, что Ваше приложение должно делать.

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


    Рисунок 8.2 Определения Объекта Employee



    Создание Иерархии
    Следующие определения Java и JavaScript для Employee сходны. Единственным отличием является то, что в Java Вы должны специфицировать тип каждого свойства, а в JavaScript - нет, и что Вам нужно создать явно метод-конструктор для Java-класса.


    JavaScriptJava
    function Employee () {

    this.name = "";

    this.dept = "general";

    }

    public class Employee {

    public String name;

    public String dept;

    public Employee () {

    this.name = "";

    this.dept = "general";

    }

    }

    Определения Manager и WorkerBee показывают отличия в специфицировании более высокого объекта в иерархии. В JavaScriptВы добавляете прототипичный экземпляр как значение свойства прототипа конструктора функции. Вы можете сделать это в любое время после определения конструктора. В Java Вы специфицируете суперкласс в определении класса. Вы не можете изменить суперкласс вне определения класса.


    JavaScriptJava

    function Manager () {

    this.reports = [];

    }

    Manager.prototype = new Employee;

    function WorkerBee () {

    this.projects = [];


    }

    WorkerBee.prototype = new Employee;

    public class Manager extends Employee {

    public Employee[] reports;

    public Manager () {

    this.reports = new Employee[0];

    }

    } public class WorkerBee extends Employee {

    public String[] projects;

    public WorkerBee () {

    this.projects = new String[0];

    }

    }

    Определения Engineer и SalesPerson создают объекты, которые происходят от WorkerBee и, следовательно, от Employee. Объект этих типов имеет свойства всех объектов, стоящих выше него в цепи иерархии. Кроме того, эти определения переопределяют наследуемое значение свойства dept новым значением, специфичным для объекта.



    JavaScriptJava


    function SalesPerson () {

    this.dept = "sales";

    this.quota = 100;

    }

    SalesPerson.prototype = new WorkerBee;
    function Engineer () {

    this.dept = "engineering";

    this.machine = "";

    }

    Engineer.prototype = new WorkerBee;



    public class SalesPerson extends WorkerBee {

    public double quota;

    public SalesPerson () {

    this.dept = "sales";

    this.quota = 100.0;

    }

    } public class Engineer extends WorkerBee {

    public String machine;

    public Engineer () {

    this.dept = "engineering";

    this.machine = "";

    }

    }

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


    Примечание


    Термин instance\экземпляр имеет специфическое техническое значение в языках на базе классов. В этих языках экземпляр является отдельным членом/member класса и фундаментально отличается от класса. В JavaScript "экземпляр" не имеет этого технического значения, поскольку JavaScript не имеет различий между классами и экземплярами. Однако, говоря о JavaScript, "экземпляр" может использоваться неформально, являясь объектом, созданным с использованием определённого конструктора функции. Так, в этом примере Вы можете неформально сказать, что jane это экземпляр объекта Engineer. Аналогично, хотя термины parent\родитель, child\дочерний, ancestor\предок и descendant\потомок не имеют формальных значений в JavaScript, Вы можете использовать их неформально для ссылки на объекты выше или ниже в цепочке прототипов.


    Рисунок 8.3 Создание Объектов с Помощью Простых Определений



    Создание Иерархии



    Создание Новых Объектов

    В JavaScript есть несколько предопределённых объектов. Кроме того, Вы можете создать Ваши собственные объекты. В JavaScript 1.2 и позднее Вы можете создать объект, используя инициализатор объекта. Альтернативно, Вы можете сначала создать конструктор функции, а затем - инстанциировать объект (создать экземпляр), используя эту функцию и оператор new.



    Создание Регулярного Выражения

    Вы конструируете регулярное выражение одним из двух способов:

  • Используя литерал регулярного выражения:
    re = /ab+c/

    Литералы регулярного выражения дают возможность компилировать регулярное выражение при вычислении скрипта. Когда регулярное выражение остаётся постоянным, используёте этот способ для повышения производительности.

  • Вызывая конструктор функции объекта RegExp:
    re = new RegExp("ab+c")

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




  • Специальные Операции

    В JavaScript имеются следующие специальные операции:





  • Ссылки на Пакеты и Классы

    Простые ссылки из JavaScript на пакеты и классы Java создают объекты JavaPackage и JavaClass. В предыдущем примере о компании Redwood, к примеру, ссылка Packages.redwood это JavaPackage-объект. Аналогично ссылка java.lang.String является JavaClass-объектом.
    В большинстве случаев Вам не нужно беспокоиться об объектах JavaPackage и JavaClass - Вы просто работаете с пакетами и классами Java, а LiveConnect создаёт эти объекты прозрачно.
    В JavaScript 1.3 и ранее JavaClass-объекты не конвертируются автоматически в экземпляры java.lang.Class. Если Вы передаёте их в качестве параметров Java-методам - Вы обязаны создавать wrapper/оболочку вокруг экземпляра java.lang.Class. В следующем примере метод forName создаёт объект-оболочку theClass, который затем передаётся методу newInstance для создания массива.
    // JavaScript 1.3

    theClass = java.lang.Class.forName("java.lang.String")

    theArray = java.lang.reflect.Array.newInstance(theClass, 5)
    В JavaScript 1.4 и позднее Вы можете передавать JavaClass-объект непосредственно в метод, как в следующем примере:
    // JavaScript 1.4

    theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)


    Строковые Литералы

    Строковой литерал это 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/Символ новой строки
    \rCarriage return/Возврат каретки
    \tTab/Табуляция
    \vVertical tab/Вертикальная табуляция \'Апостроф или одинарная кавычка
    \"Двойная кавычка
    \\ Символ "обратная наклонная линия"Backslash (\)\XXX Символ в кодировке 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. См. .


    Заменяющие (Escaping) Символы

    Для символов, не указанных в , предшествующий 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"

    Строковые Операции

    Помимо операций сравнения, может применяться операция конкатенации/объединения (+) значений двух строк, возвращающее новую строку, которая является результатом объединения двух строк-операндов. Например, "my " + " string" возвращает строку "my string".

    Сокращённая форма записи операции += также может использоваться для конкатенации строк. Например, если переменная mystring имеет значение "alpha," то выражение mystring += "bet" вычисляется до "alphabet" и это значение присваивается переменной mystring.



    Строковые Значения

    Если Вы передаёте строковые типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    lava.lang.String
    java.lang.Object
    JavaScript 1.4:


    Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением Unicode.
    JavaScript 1.3 и ранее:


    Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением ASCII.
    byte
    double
    float
    int
    long
    short
    Все значения конвертируются в числа так, как описано в .
    Строковые значения JavaScript конвертируются в числа в соответствии с правилами ECMA-262
    char
    JavaScript 1.4:


    Односимвольные строки конвертируются в Unicode-символы.
    Все иные значения конвертируются в числа.
    JavaScript 1.3 и ранее:


    Все значения конвертируются в числа.
    boolean

    Пустая строка становится false. Все иные значения становятся true.


    Свойства Объекта

    В этом разделе рассматривается наследование объектами свойств других объектов в цепи прототипов и что происходит, если Вы добавляете свойство во время прогона программы.



    This

    Ключевое слово this предназначено для обращения к текущему объекту. В общем, this ссылается на вызывающий объект в методе. Используйте this так:

    this[.propertyName]

    Пример 1.

    Предположим, функция validate проверяет значение свойства объекта и верхнее и нижнее значение:

    function validate(obj, lowval, hival) {

    if ((obj.value < lowval) (obj.value > hival))

    alert("Invalid Value!")

    }

    Вы можете вызывать validate в обработчике события onChange в каждом элементе формы, используя this для передачи ему элемента формы, как в этом примере:

    Enter a number between 18 and 99:


    onChange="validate(this, 18, 99)">

    Пример 2.

    При соединении со свойством формы, this может ссылаться на родительскую форму текущего объекта. В следующем примере форма myForm содержит Text-объект и кнопку. Если пользователь щёлкает на кнопке, значением Text-объекта становится имя формы. Обработчик onClick кнопки использует this.form для обращения к родительской форме myForm.



    Form name:




    onClick="this.form.text1.value=this.form.name">



    Typeof

    Операция typeof используется одним из следующих способов:

    1. typeof operand
    2. typeof (operand)

    Операция typeof возвращает строку, указывающую тип невычисленного операнда.
    operand это строка, переменная, ключевое слово или объект, тип которого возвращается. Скобки не обязательны.

    Предположим, Вы определяете следующие переменные:

    var myFun = new Function("5+2")

    var shape="round"
    var size=1
    var today=new Date()

    Операция typeof возвращает для этих переменных следующие результаты:

    typeof myFun is function
    typeof shape is string

    typeof size is number
    typeof today is object
    typeof dontExist is undefined

    Для ключевых слов true и null операция typeof возвращает следующие результаты:

    typeof true is boolean
    typeof null is object

    Для числа или строки операция typeof возвращает следующие результаты:

    typeof 62 is number
    typeof 'Hello world' is string

    Для значений свойств операция typeof возвращает тип значения, содержащегося в свойстве:

    typeof document.lastModified is string
    typeof window.length is number

    typeof Math.LN2 is number

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

    typeof blur is function
    typeof eval is function

    typeof parseInt is function
    typeof shape.split is function

    Для предопределённых объектов операция typeof возвращает такие результаты:

    typeof Date is function
    typeof Function is function

    typeof Math is function
    typeof Option is function
    typeof String is function

    Удаление Свойств

    Вы можете удалить свойство оператором delete. Этот код показывает, как удалить свойство.

    //Создаётся новое свойство myobj с двумя свойствами a и b.
    myobj = new Object;
    myobj.a=5;
    myobj.b=12;

    //Удаляется свойство a, и в myobj остаётся только свойство b.
    delete myobj.a;

    Можно также использовать delete для удаления глобальной переменной, если ключевое слово var не было использовано при объявлении этой переменной:
    g = 17;
    delete g;

    См. .



    Undefined-Значения

    Если Вы передаёте значения undefined JavaScript в качестве параметров методам Java, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:


    Тип Java-параметра
    Правила Конверсии

    lava.lang.String
    java.lang.Object
    Значение конвертируется в экземпляр объекта java.lang.String, значением которого является строка "undefined".
    boolean
    Значение становится false.
    double
    float
    Значение становится NaN.
    byte
    char
    int
    long
    short
    Значение становится 0.
    Конверсия значения undefined возможна только в JavaScript 1.3 и более поздних версиях. Более ранние версии JavaScript не поддерживают значения undefined.
    Если значение undefined JavaScript передаётся в качестве параметра Java-методу, который ожидает экземпляр объекта java.lang.String, значение undefined конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.


    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.



    Условная Операция

    Условная операция - единственная в JavaScript, принимающая три операнда. Она может дать одно или другое значение на базе условия. Синтаксис таков:

    condition ? val1 : val2

    Если condition - true, операция имеет значение val1. Иначе - значение val2. Вы можете использовать условную операцию в любом месте, где может использоваться стандартная операция.

    Например,

    status = (age >= 18) ? "adult" : "minor"

    Этот оператор присваивает значение "adult" переменной status, если age равен 19 или более. Иначе переменной status присваивается значение "minor".



    Условные Операторы

    Условный оператор является набором команд, которые выполняются, если специфицированное условие - true. JavaScript поддерживает два условных оператора: if...else и switch.



    Версии JavaScript

    Каждая версия Navigator поддерживает различные версии JavaScript. Чтобы помочь Вам в создании скриптов, совместимых с несколькими версиями Navigator, в этом учебнике перечисляются версии JavaScript, в которых реализована та или иная возможность языка.

    В следующей таблице содержится список версий JavaScript, поддерживаемых соответствующими версиями Navigator. Версии Navigator до 2.0 не поддерживают JavaScript.


    Таблица 1  Версии JavaScript и Navigator



    Версия JavaScriptВерсия Navigator

    JavaScript 1.0Navigator 2.0
    JavaScript 1.1 Navigator 3.0 JavaScript 1.2Navigator 4.0-4.05 JavaScript 1.3Navigator 4.06-4.7x
    JavaScript 1.4 JavaScript 1.5
    Navigator 6.0
    Mozilla (свободный ресурс)

    Каждая версия сервера Netscape Enterprise Server также поддерживает разные версии JavaScript. Чтобы помочь Вам в создании скриптов, совместимых с несколькими версиями Enterprise Server, в этом учебнике содержатся аббревиатуры названий версий сервера, в которых реализована та или иная возможность языка.


    Таблица 2   Аббревиатуры Названий Версий Netscape Enterprise Server



    Аббревиатура
    Версия Enterpriser Server

    NES 2.0 Netscape Enterprise Server 2.0 NES 3.0Netscape Enterprise Server 3.0




    Void

    Операция void используется одним из следующих способов:

    1. void (expression)
    2. void expression

    Операция void специфицирует выражение, вычисляемое без возвращения значения.
    expression это вычисляемое выражение JavaScript. Скобки вокруг выражения не обязательны, но хорошим стилем является их использование.

    Можно использовать оператор void для специфицирования выражения как гипертекстовой ссылки. Выражение вычисляется, но не загружается вместо текущего документа.

    Следующий код создаёт гипертекстовую ссылку, которая ничего не делает, если пользователь щёлкает на ней. Если пользователь щёлкает на ссылке, void(0) вычисляется в undefined, что не вызывает никаких действий в JavaScript.

    Click here to do nothing

    Следующий код создаёт гиперссылку, которая отправляет форму, если пользователь щёлкает на ссылке.


    Click here to submit




    Вычисление Переменных

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

    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




    Выполнение Глобального Поиска, Игнорирование Регистра и Рассмотрение Многострочного Ввода

    Регулярные выражения могут иметь три опции-флага, дающие возможность выполнять глобальный и нечувствительный к регистру поиск. Для глобального поиска используйте флаг g. Для поиска без учёта регистра используйте флаг i. Для многострочного поиска - флаг m. Эти флаги могут использоваться независимо или вместе в любом порядке и являются частью регулярного выражения.

    Для включения флага используется следующий синтаксис:
    re = /pattern/flags

    re = new RegExp("pattern", ["flags"])

    Обратите внимание, что флаги интегрированы в регулярное выражение. Они не могут быть позднее добавлены или удалены.
    Например, re = /\w+\s/g создаёт регулярное выражение, которое ищет один или более символов с последующим пробелом по всей строке.

    Отобразится ["fee ", "fi ", "fo "]. В этом примере Вы можете заменить строку:
    re = /\w+\s/g;
    на строку:
    re = new RegExp("\\w+\\s", "g");
    и получить аналогичный результат.
    Флаг m используется flag для специфицирования того, что многострочный ввод должен рассматриваться как несколько строк. Если используется флаг m, то ^ и $ совпадают в начале и в конце любой строки общей строки ввода, вместо начала и конца всей строки ввода.

    Выражения

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

    Концептуально есть выражения двух видов: присваивающие значение переменной и просто имеющие значение. Например, выражение x = 7 это выражение, в котором x получает значение 7. Это выражение вычисляется в 7. Такие выражения используют операции присвоения. С другой стороны, выражение 3 + 4 просто вычисляется в 7; оно не выполняет присвоения значения. Операции, используемые в таких выражениях, называются просто операциями.
    В JavaScript имеются следующие типы выражений:


  • Арифметические: вычисляются в число, например, 3.14159

  • Строковые: вычисляются до строки символов, например, "Fred" или "234"

  • Логические: вычисляются до true или false

  • Объекты: вычисляются до получения объекта




  • Вызов Функции

    Определение функции ещё не вызывает её выполнения. Определение функции просто именует её и специфицирует действия функции при её вызове. Вызов функции выполняет специфицированные действия с указанными параметрами. Например, если Вы определяете функцию square, можно будет вызвать её так:

    square(5)
    Здесь функция вызывается с аргументом 5. Функция выполняет свои операторы и возвращает значение 25.

    Аргументы функции - это не только строки или числа. Вы можете также передавать в функцию целый объект. Функция show_props (определена в ) это пример функции, принимающей объект в качестве аргумента.
    Функция может быть рекурсивной, то есть может вызывать сама себя. Например, функция вычисления факториала:
    function factorial(n) {

    if ((n == 0) (n == 1))

    return 1

    else {

    var result = (n * factorial(n-1) );

    return result

    }

    }

    Вы можете затем вычислять факториал от 1 до 5:
    a=factorial(1) // возвращает 1

    b=factorial(2) // возвращает 2

    c=factorial(3) // возвращает 6

    d=factorial(4) // возвращает 24

    e=factorial(5) // возвращает 120



    Взаимодействие Java и JavaScript

    Если Вы хотите использовать объекты JavaScript в Java, Вы обязаны импортировать пакет netscape.javascript в Ваш Java-файл. Этот пакет определяет следующие классы:

    netscape.javascript.JSObject даёт доступ Java-коду к методам и свойствам JavaScript;
    netscape.javascript.JSException даёт возможность Java-коду обрабатывать ошибки JavaScript.
    Начиная с JavaScript 1.2, эти классы поставляются в .jar файле; в предыдущих версиях JavaScript они поставлялись в .zip файле. См. в книге
    информацию об этих классах.
    Для доступа к классам LiveConnect поместите .jar или .zip файл в CLASSPATH компилятора JDK одним из следующих способов:


    Создав переменную окружения CLASSPATH и специфицировав путь и имя .jar или .zip файла.
    Специфицировав размещение .jar или .zip файла при компиляции, используя параметр командной строки -classpath.
    Например, в Navigator 4. 0 для Windows NT классы расположены в файле java40.jar в директории Program\Java\Classes ниже директории Navigator'а. Вы можете специфицировать переменную окружения в Windows NT, дважды щёлкнув иконку System в Control Panel и создав пользовательскую переменную окружения под названием CLASSPATH со значением, типа такого:
    D:\Navigator\Program\Java\Classes\java40.jar
    См. в документации Sun JDK информацию о CLASSPATH.

    Примечание

    Поскольку Java является строго типизированным языком, а JavaScript -слабо типизированным, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. полную информацию в разделе .


    Взаимодействие JavaScript и Java

    Если Вы ссылаетесь на пакет или класс Java или работаете с объектом или массивом Java, Вы используете один из специальных объектов LiveConnect. Весь доступ JavaScript к Java осуществляется через эти объекты, резюме по которым - в следующей таблице.


    Таблица 9.1   Объекты LiveConnect



    Объект
    Описание

    JavaArray
    Обёрнутый массив Java, к которому имеется доступ из кода JavaScript.
    JavaClass
    Ссылка JavaScript на Java-класс.
    JavaObject
    Обёрнутый объект Java, к которому имеется доступ из кода JavaScript.
    JavaPackage
    Ссылка JavaScript на Java-пакет.

    Примечание

    Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. .
    Иногда существование объектов LiveConnect достаточно прозрачно, поскольку Вы взаимодействуете с Java в довольно интуитивной манере. Например, Вы можете создать объект Java String и присвоить его в JavaScript переменной myString путём использования оператора new с конструктором Java таким вот образом:
    var myString = new java.lang.String("Hello world")
    Здесь переменная myString является JavaObject, поскольку она содержит экземпляр Java-объекта String. Как JavaObject, myString имеет доступ к public-методам экземпляра java.lang.String и его суперкласса, java.lang.Object. Эти Java-методы доступны в JavaScript как методы из JavaObject, и Вы можете вызывать их так:
    myString.length() // возвращает 11


    Значения

    JavaScript распознаёт значения следующих типов:

  • Числа, такие как 42 или 3.14159
  • Логические (Булевы) значения: true или false.
  • Строки, такие как "Howdy!".
  • null, специальное ключевое слово, обозначающее нулевое значение; null является также примитивным значением. Поскольку JavaScript чувствителен к регистру символов, null это не то же самое, что Null, NULL или какой-нибудь иной вариант.
  • undefined, свойство верхнего уровня, значение которого не определено/undefined; undefined является также примитивным значением.

  • Этот сравнительно небольшой набор значений типов, или типов данных, даёт возможность выполнения функций в приложении. Видимого различия между целыми и реальными числами нет. Нет в JavaScript также типа данных date. Однако Вы можете использовать объект Date и его методы для работы с датами.

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



    

        Бизнес: Предпринимательство - Малый бизнес - Управление