Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   RegExp создается с lastIndex > 0 . (https://javascript.ru/forum/misc/7034-regexp-sozdaetsya-s-lastindex-0-a.html)

Riim 12.01.2010 05:16

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 .

Kolyaj 12.01.2010 10:34

function f() {
    var re1 = /0/, re2 = new RegExp('0');
    alert([re1.foo, re2.foo]);
    re1.foo = 1;
    re2.foo = 1;
}
f();
f();
Прикольно, чо :)

Илья Кантор 12.01.2010 22:46

забавный баг

Riim 12.01.2010 22:52

Цитата:

Сообщение от Илья Кантор
забавный баг

я тоже сначала подумал что баг, но он работает в FF, Opera и Chrome, так что, наверное, не баг и как-то это должно объясняться.

PeaceCoder 12.01.2010 22:58

оч интересненько пошел рыть инфу

PeaceCoder 12.01.2010 23:15

Цитата:

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
Может поэтому ? в особенности первое.

B@rmaley.e><e 12.01.2010 23:18

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

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

Литеральные регэкспы компилируются (и конвертируются в RegExp объект) один раз, во время компиляции всего кода.

Dmitry A. Soshnikov 12.01.2010 23:27

Цитата:

Сообщение от 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 участвовал в обсуждении этого "бага". Так что, сейчас это поведение нормальное (в качестве оптимизации - регэксп может появится, например, в теле цикла).

Dmitry A. Soshnikov 12.01.2010 23:39

Цитата:

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

Ну, кстати, не такая и бредовая мысль (насчёт циклов). Только, естественно, не браузеры, а движок.

На текущий момент: IE и Safari - неправы.

B@rmaley.e><e 12.01.2010 23:52

Цитата:

Сообщение от Dmitry A. Soshnikov
На текущий момент: IE и Safari - неправы.

Учитывая поправки спецификации (ES3.1), они как-раз таки и правы.

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


Часовой пояс GMT +3, время: 00:31.