Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

В отличие от

match,
метод
ехес
возвращает массив, структура которого не зависит от наличия в регулярном выражении флага
g
. Напомню, что при передаче глобального регулярного выражения метод
match
возвращает массив найденных соответствий. А
ехес
всегда возвращает одно соответствие, но предоставляет о нем полную информацию. Когда
ехес
вызывается для регулярного выражения, содержащего флаг
g
, метод устанавливает свойство
lastlndex
объекта регулярного выражения равным номеру позиции символа, следующего непосредственно за найденной подстрокой. Когда метод
ехес
вызывается для того же регулярного выражения второй раз, он начинает поиск с символа, позиция которого указана в свойстве
lastlndex
. Если
ехес
не находит соответствия, свойство
lastindex
получает значение 0. (Вы также можете установить
lastlndex
в ноль в любой момент, что следует делать во всех тех случаях, когда поиск завершается до того, как будет найдено последнее соответствие в одной строке, и начинается поиск в другой строке с тем же объектом
RegExp
.) Это особое поведение позволяет вызывать
exec
повторно для перебора всех соответствий регулярному выражению в строке. Например:

var pattern = /Java/g;

var text = "JavaScript - это более забавная штука, чем Java!";

var result;

while((result = pattern.exec(text)) != null) {

alert("Найдено '" + result[0] + ..... +

в позиции " + result.index +

"; следующий поиск начнется с " + pattern.lastlndex);

}

Еще один метод объекта

RegExp - test,
который намного проще метода
ехес.
Он принимает строку и возвращает
true
, если строка соответствует регулярному выражению:

var pattern = /java/і;

pattern.test("JavaScript"); // Вернет true

Вызов

test
эквивалентен вызову
exec,
возвращающему true, если
exec
возвращает не
null
. По этой причине метод
test
ведет себя так же, как метод
ехес
при вызове для глобального регулярного выражения: он начинает искать указанную строку с позиции, заданной свойством
lastlndex
, и если находит соответствие, устанавливает свойство
lastlndex
равным номеру позиции символа, непосредственно следующего за найденным соответствием. Поэтому с помощью метода
test
можно так же сформировать цикл обхода строки, как с помощью метода
ехес.

Методы

search, replace
и
match
класса String не используют свойство
lastlndex
, в отличие от методов
ехес
и
test.
На самом деле методы класса
String
просто сбрасывают
lastlndex
в 0. Если метод
ехес
или
test
использовать с шаблоном, в котором установлен флаг
g
, и выполнить поиск в нескольких строках, то мы должны либо найти все соответствия в каждой строке, чтобы свойство
lastlndex
автоматически сбросилось в ноль (это происходит, когда последний поиск оказывается неудачным), либо явно установить свойство
lastlndex
равным нулю. Если этого не сделать, поиск в новой строке может начаться с некоторой произвольной позиции, а не с начала. Если регулярное выражение не включает флаг
g
, то вам не придется беспокоиться об этом. Имейте также в виду, что в ECMAScript 5, когда интерпретатор встречает литерал регулярного выражения, он создает новый объект
RegExp
, со своим собственным свойством
lastlndex
, что снижает риск использования «левого» значения
lastlndex
по ошибке.

11

Подмножества и расширения JavaScript

До сих пор в книге описывалась официальная версия языка JavaScript, соответствующая стандартам ECMAScript 3 и ECMAScript 5. В этой главе, напротив, будет идти речь о подмножествах и надмножествах языка JavaScript. Подмножества языка были определены, по большей части, для обеспечения более высокого уровня безопасности: сценарий, использующий только безопасное подмножество языка, может использоваться без опаски, даже если он был получен из непроверенного источника, такого как рекламный сервер. В разделе 11.1 описываются некоторые из этих подмножеств.

Стандарт ECMAScript 3 был опубликован в 1999 году, и прошло десять лет, прежде чем стандарт был обновлен до версии ECMAScript 5, вышедшей в 2009 году. Брендан Эйх (Brendan Eich), создатель JavaScript, продолжал развивать язык на протяжении всех этих десяти лет (спецификация ECMAScript явно разрешает расширение языка) и совместно с проектом Mozilla выпустил версии JavaScript 1.5, 1.6, 1.7, 1.8 и 1.8.1 в Firefox 1.0, 1.5, 2, 3 и 3.5. Некоторые из расширенных особенностей JavaScript вошли в стандарт ECMAScript 5, но многие остаются нестандартизованными. Однако, как ожидается, некоторые из оставшихся нестандартных особенностей будут стандартизованы в будущем.

Эти расширения поддерживаются броузером Firefox, точнее, реализованным в нем интерпретатором Spidermonkey языка JavaScript. Созданный проектом Mozilla интерпретатор Rhino языка JavaScript, написанный на языке Java (раздел 12.1), также поддерживает большинство расширений. Однако, поскольку эти расширения языка не являются стандартными, они не особенно полезны для веб-разработчиков, которым требуется обеспечить совместимость своих веб-приложений со всеми броузерами. Тем не менее они описываются в этой главе, потому что они:

• чрезвычайно мощные;

• могут быть стандартизованы в будущем;

• могут использоваться при разработке расширений для Firefox;

• могут использоваться для разработки серверных сценариев на языке JavaScript, когда используется интерпретатор Spidermonkey или Rhino (раздел 12.1).

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

  • Читать дальше
  • 1
  • ...
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: