Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.01.2010, 05:16
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

RegExp создается с lastIndex > 0 .
Объясните кто-нибудь как так:

var f = function(str) {
	var re = new RegExp('[0-9]', 'g');
	alert(re.exec(str));
};

f('as012as0');// 0
f('as012as01');// 0
f('as012as012');// 0


Здесь все верно: в запущенной функции создается RegExp со свойством lastIndex == 0 , при вызове exec lastIndex смещается, функция завершается, при повторном вызове lastIndex у нового RegExp-а снова равен нулю.

А вот что происходит здесь:
var f = function(str) {
	var re = /[0-9]/g;
	alert(re.exec(str));
};

f('as012as0');// 0
f('as012as01');// 1
f('as012as012');// 2

?
Такое ощущение, что регулярка живет дольше, чем положено.

upd: все кроме IE .

Последний раз редактировалось Riim, 12.01.2010 в 05:40.
Ответить с цитированием
  #2 (permalink)  
Старый 12.01.2010, 10:34
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

function f() {
    var re1 = /0/, re2 = new RegExp('0');
    alert([re1.foo, re2.foo]);
    re1.foo = 1;
    re2.foo = 1;
}
f();
f();
Прикольно, чо
Ответить с цитированием
  #3 (permalink)  
Старый 12.01.2010, 22:46
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,221

забавный баг
Ответить с цитированием
  #4 (permalink)  
Старый 12.01.2010, 22:52
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Илья Кантор
забавный баг
я тоже сначала подумал что баг, но он работает в FF, Opera и Chrome, так что, наверное, не баг и как-то это должно объясняться.
Ответить с цитированием
  #5 (permalink)  
Старый 12.01.2010, 22:58
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

оч интересненько пошел рыть инфу
Ответить с цитированием
  #6 (permalink)  
Старый 12.01.2010, 23:15
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Цитата:
In addition to the properties of an individual regular expression object that you create using the RegExp constructor function, the predefined RegExp object has static properties that are set whenever any regular expression is used
.
Цитата:
If your regular expression uses the "g" flag, you can use the exec method multiple times to find successive matches in the same string. When you do so, the search starts at the substring of str specified by the regular expression's lastIndex property
Может поэтому ? в особенности первое.
Ответить с цитированием
  #7 (permalink)  
Старый 12.01.2010, 23:18
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

<бредовая_мысль>А может браузеры кешируют регэкспы, чтобы не компилировать их тысячу раз (особое внимание уделяем циклам)?</бредовая_мысль>

Гугленье навело на http://stackoverflow.com/questions/1...cted-behaviourhttp://www.mail-archive.com/es-discu.../msg01796.html

Литеральные регэкспы компилируются (и конвертируются в RegExp объект) один раз, во время компиляции всего кода.
Ответить с цитированием
  #8 (permalink)  
Старый 12.01.2010, 23:27
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от ECMA-262-3 7.8.5 Regular Expression Literals
A regular expression literal is an input element that is converted to a RegExp object (section 15.10)
when it is scanned. The object is created before evaluation of the containing program or function begins.
Evaluation of the literal produces a reference to that object; it does not create a new object.
Однако, это поведение не наблюдается в Safari и IE.

https://bugzilla.mozilla.org/show_bug.cgi?id=98409 - хотели фиксить в ES4 (который не вышел), B.Eich участвовал в обсуждении этого "бага". Так что, сейчас это поведение нормальное (в качестве оптимизации - регэксп может появится, например, в теле цикла).
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 12.01.2010 в 23:38.
Ответить с цитированием
  #9 (permalink)  
Старый 12.01.2010, 23:39
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от B@rmaley.e><e
<бредовая_мысль>А может браузеры кешируют регэкспы, чтобы не компилировать их тысячу раз (особое внимание уделяем циклам)?</бредовая_мысль>
Ну, кстати, не такая и бредовая мысль (насчёт циклов). Только, естественно, не браузеры, а движок.

На текущий момент: IE и Safari - неправы.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #10 (permalink)  
Старый 12.01.2010, 23:52
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от Dmitry A. Soshnikov
На текущий момент: IE и Safari - неправы.
Учитывая поправки спецификации (ES3.1), они как-раз таки и правы.

ИЕ, как мы знаем, относится к стандартам с необычайной любовью, а Сафари... ну что ж, можно пожать разработчикам руку за то, что следят за обновлениями.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
мааленький вопрос по Regexp:) mirniy Общие вопросы Javascript 1 22.01.2009 20:47
RegExp & Mozilla (быстродействие) tau Общие вопросы Javascript 9 24.11.2008 16:35
RegExp и unicode Yury900 Общие вопросы Javascript 7 13.05.2008 00:19