Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.02.2012, 20:58
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

RegExp копаем!
Наткнулся тут на тест, для разработчиков. Один вопрос мне не дает покоя, роюсь, не могу найти:

Дан код:
var rx1 = RegExp(/regular/ + /expression/);
var rx2 = /regularexpression/;

Что нужно добавить в начало программы, чтобы rx1 и rx2 стали идентичными? Сами строчки трогать нельзя.

Мысль зашла в сторону изменения конструктора, но там же и застыла )
Есть ли кросбраузерные варианты?
Ответить с цитированием
  #2 (permalink)  
Старый 09.02.2012, 22:06
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

RegExp.prototype.toString = function () {
    return this.source;
}
__________________
readOnly
Ответить с цитированием
  #3 (permalink)  
Старый 09.02.2012, 22:17
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Чудо, спасибо!
Но почему?
Без изменения прототипа вывожу:

console.log(rx1.toString(),' - ',rx1.source);
console.log(rx2.toString(),' - ',rx2.source);

не совпадало визуально.
source же выдает просто строку без слешей по краям, а тут остальные слеши пропали.
В чем фокус?
Ответить с цитированием
  #4 (permalink)  
Старый 09.02.2012, 22:24
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

Ну мы же изменили метод toString, его результат был на вид точно такой же как RegExp записанный с помощью литерала /regexp/gmi.toString() === "/regexp/gmi", а мы метод прототипа toString заменили на свой, который просто source возвращает
__________________
readOnly
Ответить с цитированием
  #5 (permalink)  
Старый 09.02.2012, 22:30
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

т.е. при конкатенации в параметре передаваемом конструктором RegExp(/regular/ + /expression/) срабатывает toString для соединения, а когда заменили на source тот обрезал слэши?
Правильно понял?
Ответить с цитированием
  #6 (permalink)  
Старый 09.02.2012, 22:35
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

Сообщение от Keeper
т.е. при конкатенации в параметре передаваемом конструктором RegExp(/regular/ + /expression/) срабатывает toString
ага
Сообщение от Keeper
а когда заменили на source тот обрезал слэши
Никто ничего не обрезал, мы просто заменили возвращаемое значение. Можно написать

RegExp.prototype.toString = function () {
    return "Keeper";
}

new RegExp(/OLOLO/ + /NONONO/).source === "KeeperKeeper";


и оно будет идентично

/KeeperKeeper/
__________________
readOnly
Ответить с цитированием
  #7 (permalink)  
Старый 09.02.2012, 22:43
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Спасибо, все понял)
Просто не знал о срабатывании при конкатенации литералов в конструкторе )
Ответить с цитированием
  #8 (permalink)  
Старый 09.02.2012, 22:59
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

Keeper,

Сообщение от Keeper
конкатенации литералов
как это, конкатенация литералов?

В js автоматическое преобразование типов. "+" как известно выполняет или сложение или конкатенацию. Если оба операнда нельзя преобразовать к Number, то выполняется конкатенация. А в конкатенации участвуют строки. Поэтому вызывается toString, как-то так вроде
__________________
readOnly
Ответить с цитированием
  #9 (permalink)  
Старый 09.02.2012, 23:15
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Понял! )
Ответить с цитированием
  #10 (permalink)  
Старый 10.02.2012, 03:38
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Вы это кому настрочили? )
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
regexp не работает экранирование точки Spice Общие вопросы Javascript 2 10.11.2011 13:41
Подскажите как вставить переменную в RegExp c модификаторами Дмитрий-Solod Общие вопросы Javascript 2 16.11.2010 19:30
мааленький вопрос по 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