RegExp копаем!
Наткнулся тут на тест, для разработчиков. Один вопрос мне не дает покоя, роюсь, не могу найти:
Дан код: var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; Что нужно добавить в начало программы, чтобы rx1 и rx2 стали идентичными? Сами строчки трогать нельзя. Мысль зашла в сторону изменения конструктора, но там же и застыла ) Есть ли кросбраузерные варианты? |
RegExp.prototype.toString = function () { return this.source; } |
Чудо, спасибо!
Но почему? Без изменения прототипа вывожу: console.log(rx1.toString(),' - ',rx1.source); console.log(rx2.toString(),' - ',rx2.source); не совпадало визуально. source же выдает просто строку без слешей по краям, а тут остальные слеши пропали. В чем фокус? |
Ну мы же изменили метод toString, его результат был на вид точно такой же как RegExp записанный с помощью литерала /regexp/gmi.toString() === "/regexp/gmi", а мы метод прототипа toString заменили на свой, который просто source возвращает
|
т.е. при конкатенации в параметре передаваемом конструктором RegExp(/regular/ + /expression/) срабатывает toString для соединения, а когда заменили на source тот обрезал слэши?
Правильно понял? |
Цитата:
Цитата:
RegExp.prototype.toString = function () { return "Keeper"; } new RegExp(/OLOLO/ + /NONONO/).source === "KeeperKeeper"; и оно будет идентично /KeeperKeeper/ |
Спасибо, все понял)
Просто не знал о срабатывании при конкатенации литералов в конструкторе ) |
Keeper,
Цитата:
В js автоматическое преобразование типов. "+" как известно выполняет или сложение или конкатенацию. Если оба операнда нельзя преобразовать к Number, то выполняется конкатенация. А в конкатенации участвуют строки. Поэтому вызывается toString, как-то так вроде |
Понял! )
|
Вы это кому настрочили? )
|
Часовой пояс GMT +3, время: 04:57. |