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 . |
function f() { var re1 = /0/, re2 = new RegExp('0'); alert([re1.foo, re2.foo]); re1.foo = 1; re2.foo = 1; } f(); f();Прикольно, чо :) |
забавный баг
|
Цитата:
|
оч интересненько пошел рыть инфу
|
Цитата:
Цитата:
|
Гугленье навело на http://stackoverflow.com/questions/1...cted-behaviour → http://www.mail-archive.com/es-discu.../msg01796.html Литеральные регэкспы компилируются (и конвертируются в RegExp объект) один раз, во время компиляции всего кода. |
Цитата:
https://bugzilla.mozilla.org/show_bug.cgi?id=98409 - хотели фиксить в ES4 (который не вышел), B.Eich участвовал в обсуждении этого "бага". Так что, сейчас это поведение нормальное (в качестве оптимизации - регэксп может появится, например, в теле цикла). |
Цитата:
На текущий момент: IE и Safari - неправы. |
Цитата:
ИЕ, как мы знаем, относится к стандартам с необычайной любовью, а Сафари... ну что ж, можно пожать разработчикам руку за то, что следят за обновлениями. |
Часовой пояс GMT +3, время: 00:31. |