Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   RegExp копаем! (https://javascript.ru/forum/misc/25592-regexp-kopaem.html)

Keeper 09.02.2012 20:58

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

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

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

Мысль зашла в сторону изменения конструктора, но там же и застыла )
Есть ли кросбраузерные варианты?

poorking 09.02.2012 22:06

RegExp.prototype.toString = function () {
    return this.source;
}

Keeper 09.02.2012 22:17

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

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

не совпадало визуально.
source же выдает просто строку без слешей по краям, а тут остальные слеши пропали.
В чем фокус?

poorking 09.02.2012 22:24

Ну мы же изменили метод toString, его результат был на вид точно такой же как RegExp записанный с помощью литерала /regexp/gmi.toString() === "/regexp/gmi", а мы метод прототипа toString заменили на свой, который просто source возвращает

Keeper 09.02.2012 22:30

т.е. при конкатенации в параметре передаваемом конструктором RegExp(/regular/ + /expression/) срабатывает toString для соединения, а когда заменили на source тот обрезал слэши?
Правильно понял?

poorking 09.02.2012 22:35

Цитата:

Сообщение от Keeper
т.е. при конкатенации в параметре передаваемом конструктором RegExp(/regular/ + /expression/) срабатывает toString

ага
Цитата:

Сообщение от Keeper
а когда заменили на source тот обрезал слэши

Никто ничего не обрезал, мы просто заменили возвращаемое значение. Можно написать

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

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


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

/KeeperKeeper/

Keeper 09.02.2012 22:43

Спасибо, все понял)
Просто не знал о срабатывании при конкатенации литералов в конструкторе )

poorking 09.02.2012 22:59

Keeper,

Цитата:

Сообщение от Keeper
конкатенации литералов

как это, конкатенация литералов?

В js автоматическое преобразование типов. "+" как известно выполняет или сложение или конкатенацию. Если оба операнда нельзя преобразовать к Number, то выполняется конкатенация. А в конкатенации участвуют строки. Поэтому вызывается toString, как-то так вроде

Keeper 09.02.2012 23:15

Понял! )

Keeper 10.02.2012 03:38

Вы это кому настрочили? )


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