JavaScript - кроссплатформенный язык программирования с динамической типизацией. Это быстрый встраиваемый язык, используемый не только в Web, но и в XUL. Здесь он предназначен для динамического управления внешним видом, общения по сети с другими серверами, и др. JavaScript похож на С, но значительно гибче его. JavaScript появился в недрах компании Netscape и использовался в одноимённом браузере.
Переменные в JavaScript объявляются с помощью использования ключевого слова var, либо присвоением значения ранее не объявленной переменной:
// 1 var x; // 2 y = 100;
Mozilla рекумендует использовать первый вариант. Т.к. JavaScript - язык с динамической типизацией, то любой переменной мы может присвоить любое значение:
var x = 100; x = 200.2; x = "test";
Конечное значение переменной x - строка «test».
Попытка использовать необъявленную переменную (за исключением операции присваивания, как показано вначале) приводит к генерации исключения ReferenceError.
Константы - переменные, которые не могут менять своё значение или переопределяться во время работы скрипта. Например
const a = "some string"; const b = 100; a = 100; // ошибка, "a" не изменится
Переменные могут хранить несколько типов значений:
Значение undefined ведёт себя как false, если используется в булевых операциях. Результатом арифметических операций определённых и не определённых переменных будет NaN, например
var x; // значение "x" - undefined, не определено
if(!x)
x = 100; // x == 100
var x; // x == undefined var z = x * 100; // z == NaN
Значение null ведёт себя как false и как 0 соответственно в булевых и численных операциях, например
var x = null;
if(!x)
x = 100; // x == 100
var x = null; var z = x * 2; // z == 0
Литералы - значения, используемые в коде прямым текстом, например 1.24, "some string". В JavaScript есть несколько типов литералов:
Например:
// переменной "x" присвоен массив из трёх чисел - 100, не определено, 200.
var x = [100, , 200];
// переменной "x" присвоен литерал "true".
var x = true;
// переменной "x" присвоен литерал "200".
var x = 200;
// переменной "x" присвоен литерал "3.14".
var x = 3.14;
// переменной "x" присвоен литерал "2.2e+10" (другая форма записи дробного числа).
var x = 2.2e+10;
// переменной "x" присвоен литерал "hello, world!\n". Escape-последовательности
// поддерживаются такие же, как и в C.
var x = "hello, world!\n";
// переменной "x" присвоен литерал "½#M". Поддерживаются Unicode последовательности
// "\uXXXX" (XXXX - 16-ричное число), ASCII последовательности "\xXX" (XX - 16-ричное число)
// и "\XXX" (XXX - 8-ричное число).
var x = "\u00BD\x23\115";
// переменной "x" присвоен объектный литерал, теперь "x" ссылается на объект,
// у которого 3 поля "first", "second" и "third" (аналогично структуре в C).
var x = { first: 100, second: 2.2, third: "hmm" };
// пример использования объекта
var y = x.first; // y теперь равен 100.
Операторы в JavaScript в основной массе идентичны таковым в С, за исключением того, что JavaScript не поддерживает указатели, и вносит несколько новых операторов (в порядке убывания приоритета):
| доступ к члену, создание нового объекта | [] . new |
| вызов функции | () |
| инкремент, декремент | ++ -- |
| логическое не, бинарное не, одиночные +/-, тип, void, удаление | ! ~ + - typeof void delete |
| умножение, деление, модуль | * / % |
| сложение, вычитание | + - |
| бинарные сдвиги | << >> >>> |
| отношения, существование, определение | < <= > >= in instanceof |
| равенство, тождественное равенство | == != === !== |
| бинарное И | & |
| бинарное ИЛИ-НЕ | ^ |
| бинарное ИЛИ | ǀ |
| логическое И | && |
| логическое ИЛИ | ǁ |
| условие | ?: |
| присвоение | = += -= *= /= %= <<= >>= >>>= &= ^= ǀ= |
| запятая | , |
Стоит отметить, что
var d = new Date();
// 1 var x = new Date(); delete x; // 2 x = 100; delete x; // 3 var x = new Date(); x.prop = 200; delete x.prop; // свойства "prop" больше нет // 4a var x = new Array(1, 2, 3, 4, 5); delete x[0]; // элемента больше нет // 4b var x = [ 1, 2, 3, 4, 5]; delete x[0];
var x; // typeof x == "undefined"
var y = 100; // typeof y == "number"
var z = "str"; // typeof z == "string"
var g = [1, 2]; // typeof g == "object"
function s() {} // typeof s == "function"
var x = [1, 2];
if(x instanceof Array) // true
...
var x = [1, 2];
if(0 in x) // true, свойство по индексу 0 есть - число 1
...
if(3 in x) // false, такого индекса нет
...
if("prop" in x) // false, свойства с именем "prop" нет
...
x["prop"] = 100;
if("prop" in x) // true, свойство с именем "prop" уже есть
...
Для создания функции используется ключевое слово function. Функция одновременно является и объектом. Да, это свойство JavaScript. Функция - это объект стандартного класса объектов Function, который мы рассмотрим ниже в главе Предопределённые объекты. Функции можно объявлять одну в одной, в таком случае внутренняя функция видна только внутри той функции, в которой она объявлена. Внутри функции можно создавать переменные, которые не видны за пределами данной функции (кроме свойств, задействуя дуальную природу функций), и прячут глобальные переменные. Параметры передаются в скобках через запятую, без указания типа. Функция может возвращать значение с помощью ключевого слова return [литерал или переменная]. Например:
// объявление функции f с аргументами a и b
function f(a, b)
{
// тело функции
...
}
var a = 100;
function f()
{
a = 200;
}
// a == 200, использовалась глобальная переменная "a"
var a = 100;
// аргумент функции "a" прячет глобальный идентификатор "a",
// поэтому внутри этой функции мы будем работать с аргументом, а не
// с глобальной переменной
function f(a)
{
a = 200;
}
var z;
f(z);
// a == 100, глобальная переменная не поменялась
function f()
{
// внутренняя функция
function func() { return 100; }
var a = func(); // a == 100, использовалась внутренняя функция "func()"
}
// x == undefined, внутренняя функция "func()" не видна
// за пределами "f"
var x = typeof(func);
// функция, возвращающая число 100
function f()
{
return 100;
}
function f2()
{
return; // аналогично как в void функции в С
}
var x = f(); // x == 100
x = f(); // x == undefined т.к. функция ничего не вернула
Параметры примитивных типов передаются по значению, сложных (объекты) - по значению ссылки (как в Java). Это значит, что если функция принимает сложный объект как параметр, она сможет менять его свойства, но не сам объект. Такое поведение сходно с поведением функции в С, которая принимает на вход указатель. Например:
#include <stdio.h>
#include <stdlib.h>
struct S
{
int a;
};
void f(struct S *s)
{
struct S *s2 = (struct S *)malloc(sizeof(struct S));
s2->a = 200;
// пробуем переустановить поле
s->a = 100;
// пробуем переустановить сам указатель
s = s2;
}
int main(int argc, char **argv)
{
struct S *s = (struct S *)malloc(sizeof(struct S));
f(s);
// "s" не поменялся, но память утекла :-)
// s->a == 100
printf("%d\n", s->a);
return 0;
}
Аналогично и в JavaScript:
function f(obj)
{
// поменяем свойство объекта
obj.prop = "another";
// попробуем поменять сам объект
obj = { first: "hello" };
}
var x = { prop: "other" };
f(x);
// теперь
// x.prop == "another"
// x.first == undefined
Функции можно создавать по условию:
if(false)
{
function f()
{
alert("hello");
}
}
alert(typeof f); // "undefined"
if(true)
{
function f()
{
alert("hello");
}
}
alert(typeof f); // "function"
И даже присваивать переменным:
var x = function() { alert("hello"); }
x();
Можно передавать в качестве аргументов в другие функции:
function a(obj)
{
var x = obj(); // подразумеваем, что obj - функция
return x;
}
function f()
{
return 100;
}
var y = a(f); // y == 100
var z = a( function() { return 200; } ); // z == 200
Возвращать из других функций:
function f()
{
return function() { return 300; };
}
var x = f()(); // x == 300
И даже использовать в качестве прототипов объектов с поддержкой замыканий:
function a()
{
this.x = 200;
this.returnsomething = function() { return 100; }
}
var x = new a();
var y = x.returnsomething();
// x.x == 200
// y == 100
Неплохо, верно? :-)
Возвращает Unicode строку, в которой все символы не из латинского алфавита и набора * @ - _ + . / заменены на %XX (например пробел - %20), а все символы выше ASCII - на Unicode представление вида %uXXXX. Например:
escape("Hello world"); // вернёт "Hello%20world" escape("hello #%"); // "hello%20%23%25" escape("hello½"); // "hello%BD" escape("hello☺"); // "hello%u263A"
Не рекомендуется использовать эту функцию для кодирования URI, используйте encodeURI().
Проделывает обратные операции - заменяет все специальные последовательности символов на реальные символы.
Кодирует URI. Не кодирует символы : / ; ?, которые можно закодировать с помощью encodeURIComponent(). Например:
encodeURI("http://хеллоу.com"); // "http://%D1%85%D0%B5%D0%BB%D0%BB%D0%BE%D1%83.com"
encodeURI("http://hello world.com"); // "http://hello%20world.com"
Проделывает обратные операции.
Кодирует URI, включая символы : / ; ?, а это значит что URI, содержащий несколько компонент (/dir1/dir2/index.html), станет нечитаем веб-сервером. В таком случае пользуйтесь encodeURI.
Проделывает обратные операции.
Проверка на конечность числа:
if(isFinite(x)) ...
Проверка на NaN (не-число) значение:
if(isNaN(x)) ...
Конвертация строки, содержащей число, в число:
var x = parseInt("0xFF", 16); // x == 255
Конвертация строки, содержащей дробное число, в число:
var x = parseFloat("2.24355e+2"); // x == 224.355
var y = parseFloat("100"); // y == 100
Конвертация объекта в строку, использует метод toString() в объекте:
var d = new Date();
var x = String(d); // "Thu Sep 18 2008 21:56:44 GMT+0300 (EET)"
var d2 = { some: "string in object", toString: function() { return "" + this.some; } };
var x2 = String(d); // "string in object"
Есть также несколько очень полезных методов в объекте window:
Вывод в шелл сообщения. Может быть полезно при отладке. Например:
var x = 1;
...
dump("Value of x: " + x + "\n");
Показывает визуальное сообщение (message box). Например:
var x = 1;
...
alert("Value of x: " + x);
Объекты - это некие сложные сущности, хранящие свойства. Свойством может быть число, строка, метод и т.д. Это аналогично объектам в C++ или С. С объектами связано понятие прототипа. Прототип - это объект, хранящий свойства и методы для объекта внутри которого он объявлен, наподобие определения класса в C++. При создании новых объектов с помощю new, все эти объекты будут иметь свойства, определённые в прототипе. Уже созданные объекты с помощью new (до изменения прототипа) также будут иметь новые свойства, определённые в прототипе. К прототипу обращаются через имя базового объекта (Object, Date, и т.д.) и слова "prototype". Можно дописывать прототип своих и предопределённых объектов. Например:
// объект x создали до изменения прототипа
var x = new Date();
// добавляем в стандартный объект Date свой метод
Date.prototype.mymethod = function()
{
return 100;
}
// добавляем в стандартный объект Date своё числовое свойство
Date.prototype.X = 255;
// объект y создали после изменения прототипа
var y = new Date();
var z1 = x.mymethod(); // z1 == 100
var z2 = y.mymethod(); // z2 == 100
var z3 = x.X; // z3 == 255
var z4 = y.X; // z4 == 255
Для своих классов объектов можно полностью перезаписывать прототип, например, как показано в следующей главе с классом объектов Shop. Используем пример попроще:
// базовый объект, с пустым телом
function Shop() {}
// полностью перезаписали прототип на свой объект, который суть
// есть объект-инициализатор, которые мы рассмотрим ниже
// в пункте "прямая инициализация"
Shop.prototype =
{
// все объекты класса Shop будут иметь этот метод
method: function(which)
{
return 100;
}
}
var o1 = new Shop();
var o2 = new Shop();
var z1 = o1.method(); // z1 == 100
var z2 = o2.method(); // z2 == 100
Рассмотрим несколько способов создания объектов:
Мы уже рассматривали такой способ выше. В фигурных скобках через запятую создаются пары имя_свойства:значение_свойства (т.н. объектный литерал, литерал-объект, object literal):
// создали объект
var x = { some: "string in object", toString: function() { return this.some; } };
// вызвали его метод
var s = x.toString();
Мы уже рассматривали такой способ выше.
Отметим лишь, что объект объявленный через {} а не через function не может служить классом объектов, т.е. нельзя создать другие такие же объекты с помощью операции new:
function a(X)
{
// создаём новые свойства через "this" ссылку,
// к которым можно будет обращаться после создания объекта
this.x = X;
this.returnsomething = function() { return 100; }
}
// новый объект
var x = new a(10);
var y = x.returnsomething();
// x.x == 10
// y == 100
var z = x.x + y; // z == 110
var O = {};
var x = new O(); // исключение "TypeError: O is not a constructor"
Основана на свойстве JavaScript создавать свойства по мере обращения к ним на запись:
var z = {}; // пустой объект
// создали свойство "value" со значением "200"
z.value = 200;
// создали свойство-метод, который возвращает свойство "value"
z.getValue = function() { return this.value; }
var y = z.getValue(); // y == 200
Заметим, что внедрять таким образом свои свойства можно в любые объекты.
Вы уже заметили, что мы несколько раз использовали ключевое слово this. Это ссылка на текущий объект, в котором используется this, аналогично как в C++ или Java. По этой ссылке можно получать доступ к свойствам объекта из контекста самого объекта, например из вызываемой функции getValue(). За пределами всех объектов this ссылается на глобальный объект окна.
К свойству можно обращаться двумя способами:
var a = {};
a.x = 100;
var z = a.x; // z == 100
var a = {};
a.x = 100;
var z = a["x"]; // z == 100
Object представляет собой базовый объект. Все стандартные объекты (Date, Math, и т.д.) наследуются от него. Экземпляры базового объекта можно создавать с помощью new или инициализатором, как показано выше. Например:
var o = {}; // инициализатор, typeof(o) == object
var o2 = new Object(); // typeof(o2) == object
Методы:
Наследованные свойства, или свойства находящиеся в прототипе, не являются прямыми свойствами данного объекта. Например:
function Shop()
{
this.d = "direct property";
}
Shop.prototype =
{
things: [ "dvd", "cd" ],
sell: function(which)
{
return this.things.indexOf(which) >= 0;
},
toString: function()
{
return "We have " + this.things;
}
}
var x = new Shop();
var y = x.hasOwnProperty("things"); // false, т.к. things - свойства из прототипа
var z = x.hasOwnProperty("d"); // true, прямое свойство
Объект Shop возьмём из прошлого пункта.
var x = new Shop(); // объект Shop
var y = {}; // обычный объект
function MegaShop() {} // другой магазин
MegaShop.prototype = new Shop(); // наследник Shop
var z = new MegaShop();
var b1 = Shop.prototype.isPrototypeOf(x); // true, прототип x - это прототип Shop
var b2 = Shop.prototype.isPrototypeOf(y); // false, прототип y - не прототип Shop
var b3 = Shop.prototype.isPrototypeOf(z); // true, прототип z - прототип Shop
Если свойство не перечислимо, оно не будет появляться в операциях перечисления свойст объекта, например с помощью for(i in obj). Свойства объявленные в прототипе не перечислимы.
var x = new Shop();
var b1 = x.propertyIsEnumerable("things"); // false, things - свойство прототипа
var b2 = x.propertyIsEnumerable("toString"); // false, toString - наследованое свойство
var b3 = x.propertyIsEnumerable("d"); // true, d - прямое свойство
Это важный метод, преобразующий объект в строку там, где подразумеваются операции со строками. Можно (и скорее всего нужно) переопределить toString для своих классов объектов. По умолчанию возвращает строку «[object Object]». Стандартные объекты (Date, Number, и т.д.) переопределяют этот метод. toString уже определён в нашем объекте Shop. Например:
var x = new Shop(); // dump принимает строку как аргумент, // результатом операции "+" будет строка "We have dvd,cd". // // JavaScript при сложении фактически выполнит // x.toString() + "\n". Важно, что при вызове нашего метода toString (где происходит // сложение строки "We have " и массива things), JavaScript также преобразует // встроенный массив things в строку. dump(x + "\n");
Используется редко. Можно (и скорее всего нужно) переопределить valueOf для своих классов объектов.
Представляет собой массив. В качестве конструктора принимает ноль или более элементов:
var x = new Array(); // пустой массив var y = new Array(100, 200, "string"); // 3 элемента - 2 числа и строка var z = [1, 2, 3]; // также объект Array var z1 = y[0]; // z1 == 100 var z2 = y[2]; // z2 == "string"
К элементам массива можно обращаться (как на чтение, так и на запись) через оператор доступа []. Индексация элементов, также как и в С, начинается с 0.
Массив имеет свойство length, которое доступно на чтение и запись. Массив может динамически менять сой размер при записи несуществующих элементов через оператор доступа [], или через запись значения в свойство length. Важно помнить, что массив не может быть дырявым, т.е. он всегда имеет length-1 элементов, некоторые из которых могут быть не определены (undefined, несуществующие элементы). Например:
var x = new Array(); // пустой массив x[30] = 100; // z == 31, 30 undefined элементов и 1 число var z = x.length;
Методы:
Можно объединять массив со списком значений, либо с другим массивом:
var x = new Array(); var y = new Array(100, 200, "string"); var z = x.concat(y); // z == [ "1", 100, 200, "string" ]
Объединяет элементы массива в строку, принимая разделитель элементов в строке как аргумент. Разделитель по умолчанию - ", ":
var y = new Array(100, 200, "string");
var z = y.join(", "); // z == "100, 200, string"
var y = new Array(100, 200, "string"); var z = y.pop(); // z == "string", размер массива == 2 элемента
var y = new Array(100, 200, "string");
var z = y.push("string2"); // z == 4, размер массива == 4 элемента
var y = new Array(100, 200, "string"); y.reverse(); // y == [ "string", 200, 100 ]
var y = new Array(100, 200, "string"); var z = y.shift(); // z == 100, размер массива == 2 элемента
Возвращает секцию массива, основываясь на переданных индексах. Первый индекс - индекс начала, второй - до которого производить выборку (не включительно):
var y = new Array(100, 200, "string"); var z = y.slice(1,3); // z == [ 200, "string" ]
Splice позволяет вставлять элементы и удалять из этого же места элементы. Первый аргумент - индекс, с которого начинать. Второй аргумент - количество элементов, которое нужно удалить. Далее следуют элементы, которые нужно вставить.
var y = new Array(100, 200, 300, "string"); y.splice(1, 0, "hehe", "str"); // y == [ 100, "hehe", "str", 200, 300, "string" ] y.splice(1, 2, "hehe2", "str2"); // y == [ 100, "hehe2", "str2", 200, 300, "string" ]
Сортирует массив, может также принимать на вход функцию, которой будет пользоваться для сравнения. Функция сравнения должна возвращать -1, если первый аргумент меньше второго, 1 если больше, и 0 если они равны. Важно, что по умолчанию элементы сравниваются в строковом виде. Например:
var y = new Array(11, 2, 3, 4, 10, 0);
y.sort(); // y == [ 0, 10, 11, 2, 3, 4 ], странновато отсортировано
y = new Array(11, 2, 3, 4, 10, 0);
// используем прямое сравнение, т.к. мы знаем, что наши аргументы - числа,
// на выходе получаем нормально отсортированный массив
y.sort(
function(a, b)
{
if(a < b) return -1;
if(a > b) return 1;
if(a == b) return 0;
});
// y == [ 0, 2, 3, 4, 10, 11 ], отсортировано нормально
var y = new Array(100, 200); var z = y.unshift(400, 500); // z == 4, y == [ 400, 500, 100, 200 ]
Представляет собой дату. В качестве конструктора может принимать разные элементы:
var d;
d = new Date(); // текущая дата
d = new Date("September 19, 2008 00:30:00"); // из строки
d = new Date(2008, 11, 19); // год, месяц (начиная с нуля), день
d = new Date(2008, 11, 19, 0, 30, 0); // год, месяц, день, час, минуты, секунды
Методы:
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getTime(); // z == 1229639400000
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getFullYear(); // z == 2008
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getYear(); // z == 108
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getMonth(); // z == 11
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getDay(); // z == 5
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getDate(); // z == 19
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getHours(); // z == 0
d = new Date(2008, 11, 19, 0, 30, 0); var z = d.getMinutes(); // z == 30
d = new Date(2008, 11, 19, 0, 30, 25); var z = d.getSeconds(); // z == 25
d = new Date(2008, 11, 19, 0, 30, 25); var z = d.getMilliseconds(); // z == 0
d = new Date(); // текущее локальное время и дата var z = d.getTimezoneOffset(); // z == -180 (GMT+03, Беларусь)
d = new Date(); var z = d.toLocaleString(); // z == "Птн 19 Сен 2008 00:20:40"
d = new Date(); var z = d.toLocaleDateString(); // z == "19.09.2008"
d = new Date(); var z = d.toLocaleTimeString(); // z == "00:22:08"
d = new Date(); var z = d.toString(); // z == "Fri Sep 19 2008 00:22:38 GMT+0300 (EET)"
d = new Date(); var z = d.toUTCString(); // z == "Thu, 18 Sep 2008 21:27:29 GMT"
d = new Date();
var z = Date.parse("Sep 19, 2008"); // z == 1221771600000
Объект Function предназначен для создания функций во время выполнения. В качестве аргументов получает список параметров (каждый параметр в виде строки с идентификатором), и последним аргументом - строку с JavaScript кодом. Использование:
var x = new Function ("a", "b", "c", "return (a + b + c);");
var z = x("hello", ", ", "world"); // z == "hello, world"
Объект Math содержит различные математические методы и константы. Math не имеет конструктора, поэтому его методы можно использовать только напрямую, через префикс Math.
Методы:
var x = Math.abs(-1.1); // x == 1.1
var x = Math.sin(1); // x == 0.8414709848078965
var x = Math.asin(0.8414709848078965); // x == 1
var x = Math.log(2.718281828459045); // x == 1
var x = Math.ceil(2.7); // x == 3
var x = Math.floor(2.7); // x == 2
var x = Math.min(-3, 10); // x == -3
var x = Math.pow(10, 2); // x == 100
var x = Math.random(); // x == 0.577903639379265 var y = Math.random(); // y == 0.9858962869730497
var x = Math.round(2.99); // x == 3
var x = Math.sqrt(25); // x == 5
Константы:
Объект Number содержит различные методы для операций с числом и константы. Имеет конструктор.
Методы:
var z = new Number(2200); var x = z.toExponential(); // x == "2.200e+3"
var z = new Number(2.200e+3); var x = z.toFixed(); // x == "2200"
var z = new Number(2.5); var x = z.toSource(); var y = eval(x); // y == 2.5
var z = new Number(2.5); var x = z.toString(); // x == "2.5"
Константы:
Объект String представляет строку. Имеет конструктор. Объект String это не тоже самое, что строковый литерал, но JavaScript позволяет использовать строковые литералы как объекты. Например:
// JavaScript автоматически преобразует строковый литерал во временный объект // String, и выполнит запрошенный метод var y = "Hello".toLowerCase(); // y == "hello"
Методы:
var x = new String("hello");
var y = x.anchor("http://hello.com"); // y == "<a name="http://hello.com">hello</a>"
var x = new String("hello");
var y = x.big(); // y == "<big>hello</big>"
var z = x.bold(); // z == "<b>hello</b>"
var x = new String("hello");
var y = x.charAt(2); // y == "l"
var z = x.charCodeAt(); // z == 104 (символ 'l')
var x = new String("hello");
var y = x.indexOf("l"); // y == 2
var z = x.lastIndexOf("l"); // z == 3
var x = new String("hello");
var y = x.link("http://hello.com"); // y == "<a href="http://hello.com">hello</a>"
var x = new String("hello, ");
var y = x.concat("http://hello.com"); // y == "hello, http://hello.com"
Этот метод должен вызываться напрямую через объект String:
var x = String.fromCharCode(0x2639, 0x263a); // x == "☹☺"
Аргументы - строка-разделитель (или регулярное выражение), и максимальное количество обработанных элементов.
var x = new String("1, 2, 3, 4");
// "," - разделитель, число 2 - находим максимум 2 элемента
var y = x.split(",", 2); // y == [ "1", "2" ]
var x = new String("");
var y = x.split(","); // y = [ "" ]
var x = new String("hello, world");
var y = x.slice(5, 8); // y == ", w"
var z = x.slice(5); // z == ", world"
var x = new String("hello, world");
// подстрока между первым индексом и вторым
var y = x.substring(7, 10); // y == "wor"
// подстрока от индекса, с указанной длиной подстроки
var z = x.substr(0, 4); // z == "hell"
var x = new String("hello, world");
// поиск регулярного выражения "o.", что значит "символ o и любой другой символ за ним",
// возвращает массив найденных совпадений, в данном случае - 2 совпадения
var y = x.match(/o./g); // y == [ "o,", "or" ]
var x = new String("hello, world");
// поиск и замена на,строку "!"
var y = x.replace(/o./g, "!"); // y == "hell! w!ld"
var x = new String("hello, world");
// поиск и замена используя функцию, принимающую как аргумент найденное совпадение
// и возвращающую строку
var y = x.replace(/o./g, function(a) { return a + "!"; }); // y == "hello,! wor!ld"
var x = new String("hello, world");
// поиск регулярного выражения, возвращает найденный индекс, или -1
var y = x.search(/o./); // y == 4
var x = new String("Hello, World");
var y = x.toLowerCase(); // y == "hello, world"
var z = x.toUpperCase(); // z == "HELLO, WORLD"
Вставить код JavaScript в XUL документ можно двумя способами:
В этом случае мы обрамляем JavaScript код элементом script:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window
title="Example"
width="320" height="200"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript">
function func()
{
alert("Hello");
}
addEventListener("load", func, false);
</script>
</window>
Надо помнить, что в этом случае XML парсер нашего документа сочтёт, например, операторы > и <, элементами XML разметки. В этом случае надо использовать специальную XML секцию CDATA, внутри которой и пишется код. Например:
<script type="application/x-javascript">
<![CDATA[
function func()
{
var x = 0;
// сложный момент для XML парсера, но мы предупредили его
// с помощью секции CDATA
if(x < 0)
alert("Hello");
}
addEventListener("load", func, false);
]]>
</script>
Аналогично с помощью элемента script и атрибута src вставляем JavaScript код из внешнего файла:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window
title="Example"
width="320"
height="200"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="example.js" />
</window>
Где файл example.js лежит в этом же каталоге, где и XUL документ. Можно указывать относительные пути, и chrome:// пути.